home *** CD-ROM | disk | FTP | other *** search
/ AOL File Library: 9,300 to 9,399 / 9300.zip / AOLDLs / Helper Apps (MAC) / ADD ON_ Internet Config Acces / Internet Config Access .sit / Internet Config Access folder / Source (partial) / InternetConfigAccess.mod < prev    next >
Text File  |  1995-02-09  |  62KB  |  2,781 lines

  1. MODULE InternetConfigAccess;
  2. (*
  3.     Internet Config Access -- a utility to give
  4.     access via AppleScript to the Internet Config database.
  5.  
  6.     Start of development by LDO 1995 January 19.
  7.     First working version 1995 February 3.
  8.     Last modified 1995 February 9.
  9. *)
  10.  
  11.     IMPORT
  12.         SYSTEM;
  13.     FROM SYSTEM IMPORT
  14.         ADDRESS,
  15.         ADR,
  16.         CAST;
  17.     IMPORT
  18.         Types;
  19.     FROM Types IMPORT
  20.         noErr,
  21.         IORefNum,
  22.         OSErr,
  23.         ResID,
  24.         ShortInt,
  25.         Str255,
  26.         StringHandle,
  27.         StringPtr;
  28.     IMPORT
  29.         Errors;
  30.     IMPORT
  31.         Memory;
  32.     FROM Memory IMPORT
  33.         HLock,
  34.         HUnlock;
  35.     IMPORT
  36.         Files;
  37.     IMPORT
  38.         Resources;
  39.     FROM Resources IMPORT
  40.         CurResFile,
  41.         UseResFile;
  42.     FROM TextUtils IMPORT
  43.         GetIndString,
  44.         NumToString;
  45.     IMPORT
  46.         QuickDraw;
  47.     FROM QuickDraw IMPORT
  48.         GrafPort;
  49.     IMPORT
  50.         Components;
  51.     FROM Components IMPORT
  52.         ComponentInstance;
  53.     IMPORT
  54.         Menus;
  55.     IMPORT
  56.         Dialogs;
  57.     FROM Dialogs IMPORT
  58.         ParamText;
  59.     IMPORT
  60.         AppleEvents;
  61.     FROM AppleEvents IMPORT
  62.         AEDesc,
  63.         AEEventClass,
  64.         AEEventID,
  65.         AESendMode,
  66.         AppleEvent,
  67.         AEInteractWithUser,
  68.         AESend;
  69.     IMPORT
  70.         AEObjects;
  71.     FROM AEPackObject IMPORT
  72.         CreateObjSpecifier;
  73.     IMPORT
  74.         AERegistry;
  75.     IMPORT
  76.         BitManipulation;
  77.     IMPORT
  78.         Useful;
  79.     FROM Useful IMPORT
  80.         DAStrings,
  81.         CurrentA6;
  82.     IMPORT
  83.         Compatibility;
  84.     FROM Compatibility IMPORT
  85.         AppleEventsPresent;
  86.     IMPORT
  87.         CountedStrings;
  88.     FROM CountedStrings IMPORT
  89.         CopyCounted,
  90.         MakeCounted;
  91.     IMPORT
  92.         HLUseful;
  93.     FROM HLUseful IMPORT
  94.         StringExpanders,
  95.         DisplayMessageDialog,
  96.         ExpandString;
  97.     IMPORT
  98.         AEUseful;
  99.     FROM AEUseful IMPORT
  100.         DisposeAEDesc,
  101.         InitAEDesc,
  102.         MakeStringDesc,
  103.         PutStringParam;
  104.     IMPORT
  105.         AEObjectUseful;
  106.     IMPORT
  107.         CommandHandler;
  108.     FROM CommandHandler IMPORT
  109.         Command,
  110.         StateVariable,
  111.         GetStateVariableState;
  112.     IMPORT
  113.         EventHandler;
  114.     IMPORT
  115.         MenuHandler;
  116.     IMPORT
  117.         ICTypes;
  118.     IMPORT
  119.         ICCAPI;
  120.  
  121. (*
  122.     Global data
  123. *)
  124.  
  125.     CONST
  126.         MySignature = 0494E5853H (* 'INXS' *);
  127.  
  128.     CONST
  129.       (* custom class codes *)
  130.         ClassConfigEntry = 049434145H (* 'ICAE' *);
  131.     CONST
  132.       (* custom property IDs *)
  133.         SeedPropertyID = 053656564H (* 'Seed' *);
  134.         ChangesAllowedPropertyID = 052645772H (* 'RdWr' *);
  135.         ScramblingAllowedPropertyID = 03F505744H (* '?PWD' *);
  136.         ValuePropertyID = 056414C55H (* 'VALU' *);
  137.         LockedPropertyID = 04C434B44H (* 'LCKD' *);
  138.         VolatilePropertyID = 0564F4C41H (* 'VOLA' *);
  139.  
  140.     CONST
  141.       (* custom type codes *)
  142.         TypeBlob = 0424C4F42H (* 'BLOB' *); (* an arbitrary block of data *)
  143.         TypeEntryAttributes = 041545452H (* 'ATTR' *);
  144.  
  145.     CONST
  146.       (* custom token field types *)
  147.         EntryNameFieldID = 04E414D45H (* 'NAME' *);
  148.         EntrySizeFieldID = 053495A45H (* 'SIZE' *);
  149.         EntryAttributesFieldID = 041545452H (* 'ATTR' *);
  150.  
  151.     CONST
  152.       (* custom event codes *)
  153.         ScramblePasswordEventID = 03E505744H (* '>PWD' *);
  154.         UnscramblePasswordEventID = 03C505744H (* '<PWD' *);
  155.         ConvertFromPStringBlobID = 03C535452H (* '<STR' *);
  156.         ConvertToPStringBlobID = 03E535452H (* '>STR' *);
  157.         ConvertFromTextBlobID = 03C545854H (* '<TXT' *);
  158.         ConvertToTextBlobID = 03E545854H (* '>TXT' *);
  159.         ConvertFromStringListBlobID = 03C535423H (* '<ST#' *);
  160.         ConvertToStringListBlobID = 03E535423H (* '>ST#' *);
  161.  
  162.     CONST
  163.         MiscStringsID = 128;
  164.       (* indexes into 'STR#' ID MiscStringsID: *)
  165.         OKStringIndex = 1;
  166.         CancelStringIndex = 2;
  167.  
  168.     CONST
  169.         MessageStringsID = 129;
  170.       (* indexes into 'STR#' ID MessageStringsID: *)
  171.         AboutMsgIndex = 1;
  172.         ErrorEncounteredStringIndex = 2;
  173.         NeedAppleScriptIndex = 3;
  174.         NeedInternetConfigIndex = 4;
  175.  
  176.     VAR
  177.         AppResFile : IORefNum;
  178.         DefaultPort : GrafPort;
  179.         ChangesAllowed, ScramblingAllowed : StateVariable;
  180.         Quitting : BOOLEAN;
  181.         CurrentReply : AEDesc;
  182.         InternetConfig : ComponentInstance;
  183.         Err : OSErr;
  184.  
  185.     VAR
  186.         QuitCommand : Command;
  187.  
  188. (*
  189.     Useful stuff
  190. *)
  191.  
  192.     PROCEDURE PermsToUse() : ICTypes.ICPerm;
  193.       (* returns the appropriate permissions to use for accessing
  194.         the configuration database. *)
  195.  
  196.         VAR
  197.             ThePerms : ICTypes.ICPerm;
  198.  
  199.     BEGIN
  200.         IF GetStateVariableState(ChangesAllowed) <> 0 THEN
  201.             ThePerms := ICTypes.icReadWritePerm
  202.         ELSE
  203.             ThePerms := ICTypes.icReadOnlyPerm
  204.         END (*IF*);
  205.         RETURN
  206.             ThePerms
  207.     END PermsToUse;
  208.  
  209.     PROCEDURE CreateSelfEvent
  210.       (
  211.         TheAEEventClass : AEEventClass;
  212.         TheAEEventID : AEEventID;
  213.         VAR Result : AppleEvent
  214.       );
  215.       (* creates an AppleEvent to be sent to myself. *)
  216.  
  217.     BEGIN
  218.         AEUseful.CreateSelfEvent
  219.           (
  220.             (*EventClass :=*) TheAEEventClass,
  221.             (*EventID :=*) TheAEEventID,
  222.             (*ReturnID :=*) AppleEvents.kAutoGenerateReturnID,
  223.             (*TransactionID :=*) AppleEvents.kAnyTransactionID,
  224.             (*@Result :=*) Result,
  225.             (*@Err :=*) Err
  226.           )
  227.     END CreateSelfEvent;
  228.  
  229.     PROCEDURE SendEvent
  230.       (
  231.         VAR TheEvent : AppleEvent;
  232.         CanInteract : BOOLEAN
  233.       );
  234.       (* sends the specified event to its target. *)
  235.  
  236.         VAR
  237.             SendMode : AESendMode;
  238.             Reply : AppleEvent;
  239.  
  240.     BEGIN
  241.         InitAEDesc(Reply);
  242.         SendMode := AppleEvents.kAENoReply;
  243.         IF CanInteract THEN
  244.             SendMode :=
  245.                     SendMode
  246.                 +
  247.                     AppleEvents.kAECanInteract
  248.                 +
  249.                     AppleEvents.kAECanSwitchLayer
  250.         ELSE
  251.             SendMode := SendMode + AppleEvents.kAENeverInteract
  252.         END (*IF*);
  253.         Err := AESend
  254.           (
  255.             (*@theAppleEvent :=*) TheEvent,
  256.             (*@reply :=*) Reply,
  257.             (*sendMode :=*) SendMode,
  258.             (*sendPriority :=*) AppleEvents.kAENormalPriority,
  259.             (*timeOutInTicks :=*) AppleEvents.kAEDefaultTimeout,
  260.             (*idleProc :=*) AppleEvents.NoIdleFunction,
  261.             (*filterProc :=*) AppleEvents.NoEventFilterProc
  262.           );
  263.         DisposeAEDesc(Reply)
  264.     END SendEvent;
  265.  
  266.     PROCEDURE SendMyselfSimpleEvent
  267.       (
  268.         TheAEEventClass : AEEventClass;
  269.         TheAEEventID : AEEventID
  270.       );
  271.       (* sends myself a parameterless event with the
  272.         specified class and ID. *)
  273.  
  274.         VAR
  275.             TheEvent : AppleEvent;
  276.  
  277.     BEGIN
  278.         InitAEDesc(TheEvent);
  279.         LOOP (*once*)
  280.             CreateSelfEvent
  281.               (
  282.                 (*TheAEEventClass :=*) TheAEEventClass,
  283.                 (*TheAEEventID :=*) TheAEEventID,
  284.                 (*@Result :=*) TheEvent
  285.               );
  286.             IF Err <> noErr THEN
  287.                 EXIT
  288.             END (*IF*);
  289.             SendEvent(TheEvent, TRUE);
  290.           (* all done *)
  291.             EXIT
  292.         END (*LOOP*);
  293.         DisposeAEDesc(TheEvent)
  294.     END SendMyselfSimpleEvent;
  295.  
  296.     PROCEDURE CreateEntryDescriptor
  297.       (
  298.         VAR EntryName : ARRAY OF CHAR;
  299.         VAR ObjectDescriptor : AEDesc
  300.       );
  301.       (* creates an object descriptor for the configuration entry
  302.         with the specified name. *)
  303.  
  304.         VAR
  305.             NullDescriptor, NameDescriptor : AEDesc;
  306.  
  307.     BEGIN
  308.         InitAEDesc(NullDescriptor);
  309.         InitAEDesc(NameDescriptor);
  310.         LOOP (*once*)
  311.             MakeStringDesc
  312.               (
  313.                 (*@TheString :=*) EntryName,
  314.                 (*@TheDesc :=*) NameDescriptor,
  315.                 (*@Err :=*) Err
  316.               );
  317.             IF Err <> noErr THEN
  318.                 EXIT
  319.             END (*IF*);
  320.             Err := CreateObjSpecifier
  321.               (
  322.                 (*desiredClass :=*) ClassConfigEntry,
  323.                 (*@theContainer :=*) NullDescriptor,
  324.                 (*keyForm :=*) AEObjects.formName,
  325.                 (*@keyData :=*) NameDescriptor,
  326.                 (*disposeInputs :=*) FALSE,
  327.                 (*@objSpecifier :=*) ObjectDescriptor
  328.               );
  329.             IF Err <> noErr THEN
  330.                 EXIT
  331.             END (*IF*);
  332.          (* all done *)
  333.             EXIT
  334.         END (*LOOP*);
  335.         DisposeAEDesc(NameDescriptor)
  336.     END CreateEntryDescriptor;
  337.  
  338. (*
  339.     Message display
  340. *)
  341.  
  342.     PROCEDURE CanInteract() : BOOLEAN;
  343.       (* is interaction with the user currently allowed or not. *)
  344.  
  345.         VAR
  346.             Err : OSErr;
  347.  
  348.     BEGIN
  349.         IF AppleEventsPresent() THEN (* could be called when displaying error message about lack of AppleEvents *)
  350.             Err := AEInteractWithUser
  351.               (
  352.                 (*timeOutInTicks :=*) AppleEvents.kAEDefaultTimeout,
  353.                 (*nmReqPtr :=*) NIL,
  354.                 (*idleProc :=*) AppleEvents.NoIdleFunction
  355.               )
  356.         ELSE
  357.             Err := noErr
  358.         END (*IF*);
  359.         RETURN
  360.             Err = noErr
  361.     END CanInteract;
  362.  
  363.     PROCEDURE DisplayMessageIndex
  364.       (
  365.         MessageIndex : CARDINAL;
  366.         IconID : ResID
  367.       );
  368.       (* displays the appropriate message string from 'STR#'
  369.         ID MessageStringsID, accompanied by the specified icon. *)
  370.  
  371.         VAR
  372.             PreviousResFile : IORefNum;
  373.             MessageTemplate, MessageString, OKString : Str255;
  374.             ExpansionTemp : Str255;
  375.             ButtonHit : ShortInt;
  376.  
  377.         PROCEDURE SubstituteParamStrings
  378.           (
  379.             EscapeCode : CHAR;
  380.             VAR Expansion : StringPtr
  381.           );
  382.           (* substitutes dialog parameter strings into message text. *)
  383.  
  384.             VAR
  385.                 ThisString : StringHandle;
  386.  
  387.         BEGIN
  388.             CASE EscapeCode OF
  389.             | '0', '1', '2', '3':
  390.                 ThisString := DAStrings[ORD(EscapeCode) - ORD('0')]
  391.             ELSE
  392.                 ThisString := NIL
  393.             END (*CASE*);
  394.             IF ThisString <> NIL THEN
  395.                 HLock(ThisString);
  396.                 CopyCounted(ThisString^, ExpansionTemp);
  397.                 HUnlock(ThisString);
  398.                 Expansion := ADR(ExpansionTemp)
  399.             END (*IF*)
  400.         END SubstituteParamStrings;
  401.  
  402.     BEGIN (*DisplayMessageIndex*)
  403.         PreviousResFile := CurResFile();
  404.         UseResFile(AppResFile);
  405.         IF CanInteract() THEN
  406.             GetIndString(OKString, MiscStringsID, OKStringIndex);
  407.             GetIndString(MessageTemplate, MessageStringsID, MessageIndex);
  408.             DisplayMessageDialog
  409.               (
  410.                 (*MessageString :=*) ADR(MessageTemplate),
  411.                 (*SubstituteParamText :=*) TRUE,
  412.                 (*IconID :=*) IconID,
  413.                 (*Button1String :=*) ADR(OKString),
  414.                 (*Button2String :=*) NIL,
  415.                 (*Button3String :=*) NIL,
  416.                 (*Filter :=*) Dialogs.noModalFilterProc,
  417.                 (*@ButtonHit :=*) ButtonHit
  418.               )
  419.         ELSIF CurrentReply.dataHandle <> NIL THEN
  420.             ExpandString
  421.               (
  422.                 (*Source :=*) ADR(MessageTemplate),
  423.                 (*@Destination :=*) MessageString,
  424.                 (*Escape :=*) HLUseful.StandardEscape,
  425.                 (*International :=*) TRUE,
  426.                 (*Expand :=*) CAST(StringExpanders, ADR(SubstituteParamStrings)),
  427.                 (*ExpanderArg :=*) CurrentA6()
  428.               );
  429.             PutStringParam
  430.               (
  431.                 (*@TheAppleEvent :=*) CurrentReply,
  432.                 (*Keyword :=*) AppleEvents.keyErrorString,
  433.                 (*@TheString :=*) MessageString,
  434.                 (*@Err :=*) Err
  435.               )
  436.         END (*IF*);
  437.         UseResFile(PreviousResFile)
  438.     END DisplayMessageIndex;
  439.  
  440.     PROCEDURE DisplayErrorMessageIndex
  441.       (
  442.         MessageIndex : CARDINAL
  443.       );
  444.       (* displays the appropriate message string from 'STR#'
  445.         ID MessageStringsID, as an error message. *)
  446.  
  447.     BEGIN
  448.         DisplayMessageIndex
  449.           (
  450.             (*MessageIndex :=*) MessageIndex,
  451.             (*IconID :=*) Dialogs.stopIcon
  452.           )
  453.     END DisplayErrorMessageIndex;
  454.  
  455.     PROCEDURE OSError
  456.       (
  457.         DoingWhat : ARRAY OF CHAR
  458.       ) : BOOLEAN;
  459.       (* reports an error message iff Err is nonzero, returning
  460.         true if so. *)
  461.  
  462.         VAR
  463.             Param0, Param1 : Str255;
  464.             NullString : CHAR;
  465.             GotError : BOOLEAN;
  466.  
  467.     BEGIN
  468.         GotError := Err <> noErr;
  469.         IF GotError THEN
  470.             NumToString(Err, Param0);
  471.             MakeCounted(DoingWhat, Param1);
  472.             NullString := 0C;
  473.             ParamText(ADR(Param0), ADR(Param1), ADR(NullString), ADR(NullString));
  474.             DisplayErrorMessageIndex(ErrorEncounteredStringIndex)
  475.         END (*IF*);
  476.         RETURN
  477.             GotError
  478.     END OSError;
  479.  
  480. (*
  481.     AppleEvent handling
  482. *)
  483.  
  484.     MODULE AEHandling;
  485.  
  486.         FROM SYSTEM IMPORT
  487.             ADDRESS,
  488.             ADR,
  489.             CAST,
  490.             SAVEREGS;
  491.         FROM Types IMPORT
  492.             noErr,
  493.             Byte,
  494.             HandleState,
  495.             IORefNum,
  496.             OSErr,
  497.             RefConType,
  498.             ShortCard,
  499.             Size,
  500.             Str255,
  501.             StringPtr;
  502.         IMPORT
  503.             Errors;
  504.         FROM Memory IMPORT
  505.             BlockMoveData,
  506.             GetHandleSize,
  507.             HLock,
  508.             HSetState,
  509.             HUnlock,
  510.             MemError,
  511.             NewHandle,
  512.             SetHandleSize;
  513.         FROM Resources IMPORT
  514.             CurResFile,
  515.             Get1Resource,
  516.             UseResFile;
  517.         FROM Dialogs IMPORT
  518.             ParamText;
  519.         IMPORT
  520.             AppleEvents;
  521.         FROM AppleEvents IMPORT
  522.             AEDesc,
  523.             AEDescList,
  524.             AEEventClass,
  525.             AEEventID,
  526.             AEHandlerProc,
  527.             AEKeyword,
  528.             AERecord,
  529.             AppleEvent,
  530.             DescCoercionHandler,
  531.             DescType,
  532.             PtrCoercionHandler,
  533.             AECreateDesc,
  534.             AEGetKeyDesc,
  535.             AEInstallDescCoercionHandler,
  536.             AEInstallEventHandler,
  537.             AEInstallPtrCoercionHandler,
  538.             AEPutParamDesc,
  539.             AEPutParamPtr,
  540.             AEPutPtr;
  541.         IMPORT
  542.             AERegistry;
  543.         IMPORT
  544.             AEObjects;
  545.         FROM AEObjects IMPORT
  546.             AccessorProc,
  547.             CountProc,
  548.             AEInstallObjectAccessor,
  549.             AEObjectInit,
  550.             AESetObjectCallbacks;
  551.         FROM BitManipulation IMPORT
  552.             BXorBU;
  553.         IMPORT
  554.             Useful;
  555.         FROM Useful IMPORT
  556.             CurrentA6,
  557.             GetByte,
  558.             IgnoreComponentResult,
  559.             NoPurgeHandle,
  560.             SetByte,
  561.             SetWord,
  562.             TraverseStringList;
  563.         FROM CountedStrings IMPORT
  564.             AppendCharBlock;
  565.         FROM HLUseful IMPORT
  566.             NoCleanupList,
  567.             GetShortVersionString;
  568.         FROM AEUseful IMPORT
  569.             AEListAction,
  570.             CoerceToBlock,
  571.             CoerceToString,
  572.             DisposeAEDesc,
  573.             DisposeAEToken,
  574.             GetBoolArg,
  575.             GetStringArg,
  576.             InitAEDesc,
  577.             NewAEList,
  578.             TraverseAEList;
  579.         IMPORT
  580.             AEObjectUseful;
  581.         FROM AEObjectUseful IMPORT
  582.             AEToken,
  583.             AppToken,
  584.             AddAccessorProc,
  585.             AddCompareProc,
  586.             AddCountProc,
  587.             AddAEHandlerProc,
  588.             AddElementCreatorRoutine,
  589.             AddPropertyAccessorProc,
  590.             CreateAEToken,
  591.             GetCurrentToken,
  592.             GetDataArg,
  593.             GetPrivateDataField,
  594.             SetDataBlockField,
  595.             SetDataDescriptorField,
  596.             SetDataField,
  597.             SetDataSizeField,
  598.             SetDataTypeField,
  599.             SetGetDataRoutineField,
  600.             SetObjectDescriptor,
  601.             SetPrivateDataField,
  602.             SetSetDataRoutineField;
  603.         FROM CommandHandler IMPORT
  604.             StateVariable,
  605.             GetStateVariableState;
  606.         IMPORT
  607.             ICTypes;
  608.         FROM ICTypes IMPORT
  609.             ICAttr;
  610.         FROM ICCAPI IMPORT
  611.             ICBegin,
  612.             ICCountPref,
  613.             ICDeletePref,
  614.             ICEnd,
  615.             ICGetIndPref,
  616.             ICGetPref,
  617.             ICGetSeed,
  618.             ICSetPref;
  619.         IMPORT
  620.             AboutMsgIndex,
  621.             ChangesAllowedPropertyID,
  622.             ClassConfigEntry,
  623.             ConvertFromPStringBlobID,
  624.             ConvertFromStringListBlobID,
  625.             ConvertFromTextBlobID,
  626.             ConvertToPStringBlobID,
  627.             ConvertToStringListBlobID,
  628.             ConvertToTextBlobID,
  629.             EntryAttributesFieldID,
  630.             EntryNameFieldID,
  631.             EntrySizeFieldID,
  632.             LockedPropertyID,
  633.             MySignature,
  634.             ScramblePasswordEventID,
  635.             ScramblingAllowedPropertyID,
  636.             SeedPropertyID,
  637.             TypeBlob,
  638.             TypeEntryAttributes,
  639.             UnscramblePasswordEventID,
  640.             ValuePropertyID,
  641.             VolatilePropertyID,
  642.             AppResFile,
  643.             ChangesAllowed,
  644.             Err,
  645.             InternetConfig,
  646.             Quitting,
  647.             ScramblingAllowed,
  648.             CreateEntryDescriptor,
  649.             DisplayMessageIndex;
  650.         EXPORT
  651.             InitAEHandling;
  652.  
  653.         PROCEDURE HandleOpenApplicationEvent
  654.           (
  655.             VAR TheAppleEvent : AppleEvent;
  656.             VAR Reply : AppleEvent;
  657.             HandlerRefCon : RefConType
  658.           ) : OSErr;
  659.           (* handles an "open application" event. *)
  660.  
  661.         BEGIN
  662.             SAVEREGS;
  663.           (* nothing to do *)
  664.             RETURN
  665.                 noErr
  666.         END HandleOpenApplicationEvent;
  667.  
  668.         PROCEDURE HandleQuitEvent
  669.           (
  670.             VAR TheAppleEvent : AppleEvent;
  671.             VAR Reply : AppleEvent;
  672.             HandlerRefCon : RefConType
  673.           ) : OSErr;
  674.           (* handles a request to quit the application. *)
  675.  
  676.         BEGIN
  677.             SAVEREGS;
  678.             Quitting := TRUE;
  679.             RETURN
  680.                 noErr
  681.         END HandleQuitEvent;
  682.  
  683.         PROCEDURE HandleAboutEvent
  684.           (
  685.             VAR TheAppleEvent : AppleEvent;
  686.             VAR Reply : AppleEvent;
  687.             HandlerRefCon : RefConType
  688.           ) : OSErr;
  689.           (* handles a request to display my about box. *)
  690.  
  691.             VAR
  692.                 VersionStr : Str255;
  693.                 NullString : CHAR;
  694.  
  695.         BEGIN
  696.             SAVEREGS;
  697.             GetShortVersionString(1, VersionStr);
  698.             NullString := 0C;
  699.             ParamText
  700.               (
  701.                 ADR(VersionStr),
  702.                 ADR(NullString),
  703.                 ADR(NullString),
  704.                 ADR(NullString)
  705.               );
  706.             DisplayMessageIndex(AboutMsgIndex, 128);
  707.             RETURN
  708.                 noErr
  709.         END HandleAboutEvent;
  710.  
  711.         PROCEDURE HandleScramblePassword
  712.           (
  713.             VAR TheAppleEvent : AppleEvent;
  714.             VAR Reply : AppleEvent;
  715.             HandlerRefCon : RefConType
  716.           ) : OSErr;
  717.           (* handles scrambling/unscrambling of passwords. *)
  718.  
  719.             VAR
  720.                 TheData : AEDesc;
  721.                 DataSize, ThisOffset : Size;
  722.                 ThisPtr : ADDRESS;
  723.  
  724.         BEGIN
  725.             SAVEREGS;
  726.             InitAEDesc(TheData);
  727.             LOOP (*once*)
  728.                 IF GetStateVariableState(ScramblingAllowed) = 0 THEN
  729.                     Err := AppleEvents.errAEEventNotHandled;
  730.                     EXIT
  731.                 END (*IF*);
  732.                 GetDataArg
  733.                   (
  734.                     (*@TheAppleEvent :=*) TheAppleEvent,
  735.                     (*ArgKeyword :=*) AppleEvents.keyDirectObject,
  736.                     (*DesiredType :=*) AppleEvents.typeChar,
  737.                     (*@TheData :=*) TheData,
  738.                     (*@Err :=*) Err
  739.                   );
  740.                 IF Err <> noErr THEN
  741.                     EXIT
  742.                 END (*IF*);
  743.                 DataSize := GetHandleSize(TheData.dataHandle);
  744.                 ThisOffset := 0;
  745.                 LOOP
  746.                   (* apply symmetrical scrambling/unscrambling algorithm *)
  747.                     IF ThisOffset = DataSize THEN
  748.                         EXIT
  749.                     END (*IF*);
  750.                     ThisPtr := TheData.dataHandle^ + ThisOffset;
  751.                     INC(ThisOffset);
  752.                     SetByte
  753.                       (
  754.                         (*Val :=*) BXorBU
  755.                           (
  756.                             CAST(Byte, GetByte(ThisPtr)),
  757.                             CAST(Byte, ThisOffset + 055H)
  758.                           ),
  759.                         (*Dst :=*) ThisPtr
  760.                       )
  761.                 END (*LOOP*);
  762.                 Err := AEPutParamDesc
  763.                   (
  764.                     (*@theAppleEvent :=*) Reply,
  765.                     (*theAEKeyword :=*) AppleEvents.keyDirectObject,
  766.                     (*@theAEDesc :=*) TheData
  767.                   );
  768.                 IF Err <> noErr THEN
  769.                     EXIT
  770.                 END (*IF*);
  771.               (* all done *)
  772.                 EXIT
  773.             END (*LOOP*);
  774.             DisposeAEDesc(TheData);
  775.             RETURN
  776.                 Err
  777.         END HandleScramblePassword;
  778.  
  779.         PROCEDURE ConvertFromPStringBlob
  780.           (
  781.             VAR TheAppleEvent : AppleEvent;
  782.             VAR Reply : AppleEvent;
  783.             HandlerRefCon : RefConType
  784.           ) : OSErr;
  785.           (* treats a blob as a Pascal string and converts it to text. *)
  786.  
  787.             VAR
  788.                 SrcData, DstData : AEDesc;
  789.                 StringLength : CARDINAL;
  790.  
  791.         BEGIN
  792.             SAVEREGS;
  793.             InitAEDesc(SrcData);
  794.             InitAEDesc(DstData);
  795.             LOOP (*once*)
  796.                 GetDataArg
  797.                   (
  798.                     (*@TheAppleEvent :=*) TheAppleEvent,
  799.                     (*ArgKeyword :=*) AppleEvents.keyDirectObject,
  800.                     (*DesiredType :=*) TypeBlob,
  801.                     (*@TheData :=*) SrcData,
  802.                     (*@Err :=*) Err
  803.                   );
  804.                 IF Err <> noErr THEN
  805.                     EXIT
  806.                 END (*IF*);
  807.                 HLock(SrcData.dataHandle);
  808.                 StringLength := CAST(CARDINAL, SrcData.dataHandle^^);
  809.                 Err := AECreateDesc
  810.                   (
  811.                     (*typeCode :=*) AppleEvents.typeChar,
  812.                     (*dataPtr :=*) SrcData.dataHandle^ + 1,
  813.                     (*dataSize :=*) StringLength,
  814.                     (*@result :=*) DstData
  815.                   );
  816.                 HUnlock(SrcData.dataHandle);
  817.                 IF Err <> noErr THEN
  818.                     EXIT
  819.                 END (*IF*);
  820.                 Err := AEPutParamDesc
  821.                   (
  822.                     (*@theAppleEvent :=*) Reply,
  823.                     (*theAEKeyword :=*) AppleEvents.keyDirectObject,
  824.                     (*@theAEDesc :=*) DstData
  825.                   );
  826.                 IF Err <> noErr THEN
  827.                     EXIT
  828.                 END (*IF*);
  829.               (* all done *)
  830.                 EXIT
  831.             END (*LOOP*);
  832.             DisposeAEDesc(SrcData);
  833.             DisposeAEDesc(DstData);
  834.             RETURN
  835.                 Err
  836.         END ConvertFromPStringBlob;
  837.  
  838.         PROCEDURE ConvertToPStringBlob
  839.           (
  840.             VAR TheAppleEvent : AppleEvent;
  841.             VAR Reply : AppleEvent;
  842.             HandlerRefCon : RefConType
  843.           ) : OSErr;
  844.           (* converts text to a blob as a Pascal string. *)
  845.  
  846.             VAR
  847.                 SrcData : AEDesc;
  848.                 ActualType : DescType;
  849.                 SrcStr : Str255;
  850.  
  851.         BEGIN
  852.             SAVEREGS;
  853.             InitAEDesc(SrcData);
  854.             LOOP (*once*)
  855.                 GetDataArg
  856.                   (
  857.                     (*@TheAppleEvent :=*) TheAppleEvent,
  858.                     (*ArgKeyword :=*) AppleEvents.keyDirectObject,
  859.                     (*DesiredType :=*) AppleEvents.typeChar,
  860.                     (*@TheData :=*) SrcData,
  861.                     (*@Err :=*) Err
  862.                   );
  863.                 IF Err <> noErr THEN
  864.                     EXIT
  865.                 END (*IF*);
  866.                 CoerceToString
  867.                   (
  868.                     (*@TheDesc :=*) SrcData,
  869.                     (*@Result :=*) SrcStr,
  870.                     (*@Err :=*) Err
  871.                   );
  872.                 IF Err <> noErr THEN
  873.                     EXIT
  874.                 END (*IF*);
  875.                 Err := AEPutParamPtr
  876.                   (
  877.                     (*@theAppleEvent :=*) Reply,
  878.                     (*theAEKeyword :=*) AppleEvents.keyDirectObject,
  879.                     (*typeCode :=*) TypeBlob,
  880.                     (*dataPtr :=*) ADR(SrcStr),
  881.                     (*dataSize :=*) ORD(SrcStr[0]) + 1
  882.                   );
  883.                 IF Err <> noErr THEN
  884.                     EXIT
  885.                 END (*IF*);
  886.               (* all done *)
  887.                 EXIT
  888.             END (*LOOP*);
  889.             DisposeAEDesc(SrcData);
  890.             RETURN
  891.                 Err
  892.         END ConvertToPStringBlob;
  893.  
  894.         PROCEDURE ConvertFromTextBlob
  895.           (
  896.             VAR TheAppleEvent : AppleEvent;
  897.             VAR Reply : AppleEvent;
  898.             HandlerRefCon : RefConType
  899.           ) : OSErr;
  900.           (* converts a blob to text. *)
  901.  
  902.             VAR
  903.                 TheData : AEDesc;
  904.  
  905.         BEGIN
  906.             SAVEREGS;
  907.             InitAEDesc(TheData);
  908.             LOOP (*once*)
  909.                 GetDataArg
  910.                   (
  911.                     (*@TheAppleEvent :=*) TheAppleEvent,
  912.                     (*ArgKeyword :=*) AppleEvents.keyDirectObject,
  913.                     (*DesiredType :=*) TypeBlob,
  914.                     (*@TheData :=*) TheData,
  915.                     (*@Err :=*) Err
  916.                   );
  917.                 IF Err <> noErr THEN
  918.                     EXIT
  919.                 END (*IF*);
  920.                 TheData.descriptorType := AppleEvents.typeChar;
  921.                 Err := AEPutParamDesc
  922.                   (
  923.                     (*@theAppleEvent :=*) Reply,
  924.                     (*theAEKeyword :=*) AppleEvents.keyDirectObject,
  925.                     (*@theAEDesc :=*) TheData
  926.                   );
  927.                 IF Err <> noErr THEN
  928.                     EXIT
  929.                 END (*IF*);
  930.               (* all done *)
  931.                 EXIT
  932.             END (*LOOP*);
  933.             DisposeAEDesc(TheData);
  934.             RETURN
  935.                 Err
  936.         END ConvertFromTextBlob;
  937.  
  938.         PROCEDURE ConvertToTextBlob
  939.           (
  940.             VAR TheAppleEvent : AppleEvent;
  941.             VAR Reply : AppleEvent;
  942.             HandlerRefCon : RefConType
  943.           ) : OSErr;
  944.           (* converts text to a blob. *)
  945.  
  946.             VAR
  947.                 TheData : AEDesc;
  948.  
  949.         BEGIN
  950.             SAVEREGS;
  951.             InitAEDesc(TheData);
  952.             LOOP (*once*)
  953.                 GetDataArg
  954.                   (
  955.                     (*@TheAppleEvent :=*) TheAppleEvent,
  956.                     (*ArgKeyword :=*) AppleEvents.keyDirectObject,
  957.                     (*DesiredType :=*) AppleEvents.typeChar,
  958.                     (*@TheData :=*) TheData,
  959.                     (*@Err :=*) Err
  960.                   );
  961.                 IF Err <> noErr THEN
  962.                     EXIT
  963.                 END (*IF*);
  964.                 TheData.descriptorType := TypeBlob;
  965.                 Err := AEPutParamDesc
  966.                   (
  967.                     (*@theAppleEvent :=*) Reply,
  968.                     (*theAEKeyword :=*) AppleEvents.keyDirectObject,
  969.                     (*@theAEDesc :=*) TheData
  970.                   );
  971.                 IF Err <> noErr THEN
  972.                     EXIT
  973.                 END (*IF*);
  974.               (* all done *)
  975.                 EXIT
  976.             END (*LOOP*);
  977.             DisposeAEDesc(TheData);
  978.             RETURN
  979.                 Err
  980.         END ConvertToTextBlob;
  981.  
  982.         PROCEDURE ConvertFromStringListBlob
  983.           (
  984.             VAR TheAppleEvent : AppleEvent;
  985.             VAR Reply : AppleEvent;
  986.             HandlerRefCon : RefConType
  987.           ) : OSErr;
  988.           (* converts a STR#-format blob to a list of text strings. *)
  989.  
  990.             VAR
  991.                 SrcData : AEDesc;
  992.                 DstData : AEDescList;
  993.  
  994.             PROCEDURE AnotherString
  995.               (
  996.                 ThisString : StringPtr;
  997.                 StringIndex : CARDINAL;
  998.                 VAR KeepGoing : BOOLEAN
  999.               );
  1000.               (* action routine to add another string to the result list. *)
  1001.  
  1002.             BEGIN
  1003.                 Err := AEPutPtr
  1004.                   (
  1005.                     (*@theAEDescList :=*) DstData,
  1006.                     (*index :=*) 0,
  1007.                     (*typeCode :=*) AppleEvents.typeChar,
  1008.                     (*dataPtr :=*) ADR(ThisString^[1]),
  1009.                     (*dataSize :=*) ORD(ThisString^[0])
  1010.                   );
  1011.                 IF Err <> noErr THEN
  1012.                     KeepGoing := FALSE
  1013.                 END (*IF*)
  1014.             END AnotherString;
  1015.  
  1016.         BEGIN (*ConvertFromStringListBlob*)
  1017.             SAVEREGS;
  1018.             InitAEDesc(SrcData);
  1019.             InitAEDesc(DstData);
  1020.             LOOP (*once*)
  1021.                 GetDataArg
  1022.                   (
  1023.                     (*@TheAppleEvent :=*) TheAppleEvent,
  1024.                     (*ArgKeyword :=*) AppleEvents.keyDirectObject,
  1025.                     (*DesiredType :=*) TypeBlob,
  1026.                     (*@TheData :=*) SrcData,
  1027.                     (*@Err :=*) Err
  1028.                   );
  1029.                 IF Err <> noErr THEN
  1030.                     EXIT
  1031.                 END (*IF*);
  1032.                 NewAEList(DstData, Err);
  1033.                 IF Err <> noErr THEN
  1034.                     EXIT
  1035.                 END (*IF*);
  1036.                 HLock(SrcData.dataHandle);
  1037.                 TraverseStringList
  1038.                   (
  1039.                     (*TheStringList :=*) SrcData.dataHandle,
  1040.                     (*Action :=*) CAST(Useful.StringListActions, ADR(AnotherString)),
  1041.                     (*ActionArg :=*) CurrentA6()
  1042.                   );
  1043.                 HUnlock(SrcData.dataHandle);
  1044.                 IF Err <> noErr THEN
  1045.                     EXIT
  1046.                 END (*IF*);
  1047.                 Err := AEPutParamDesc
  1048.                   (
  1049.                     (*@theAppleEvent :=*) Reply,
  1050.                     (*theAEKeyword :=*) AppleEvents.keyDirectObject,
  1051.                     (*@theAEDesc :=*) DstData
  1052.                   );
  1053.                 IF Err <> noErr THEN
  1054.                     EXIT
  1055.                 END (*IF*);
  1056.               (* all done *)
  1057.                 EXIT
  1058.             END (*LOOP*);
  1059.             DisposeAEDesc(SrcData);
  1060.             DisposeAEDesc(DstData);
  1061.             RETURN
  1062.                 Err
  1063.         END ConvertFromStringListBlob;
  1064.  
  1065.         PROCEDURE ConvertToStringListBlob
  1066.           (
  1067.             VAR TheAppleEvent : AppleEvent;
  1068.             VAR Reply : AppleEvent;
  1069.             HandlerRefCon : RefConType
  1070.           ) : OSErr;
  1071.           (* converts a list of text strings to a STR#-format blob. *)
  1072.  
  1073.             CONST
  1074.                 GrowIncrement = 256;
  1075.             VAR
  1076.                 SrcData : AEDescList;
  1077.                 DstData : AEDesc;
  1078.                 DstDataOffset, DstDataSize : LONGCARD;
  1079.                 NrStrings : ShortCard;
  1080.  
  1081.             PROCEDURE AnotherString
  1082.               (
  1083.                 VAR TheElement : AEDesc;
  1084.                 ElementIndex : LONGINT;
  1085.                 ElementKeyword : AEKeyword;
  1086.                 VAR KeepGoing : BOOLEAN
  1087.               );
  1088.               (* action routine to add another string to the result list. *)
  1089.  
  1090.                 VAR
  1091.                     ThisStr : Str255;
  1092.                     StringLength, NewDataSize : LONGCARD;
  1093.  
  1094.             BEGIN
  1095.                 LOOP (*once*)
  1096.                     ThisStr[0] := 0C;
  1097.                     HLock(TheElement.dataHandle);
  1098.                     AppendCharBlock
  1099.                       (
  1100.                         (*Src :=*) TheElement.dataHandle^,
  1101.                         (*Length :=*) GetHandleSize(TheElement.dataHandle),
  1102.                         (*@Dst :=*) ThisStr
  1103.                       );
  1104.                     HUnlock(TheElement.dataHandle);
  1105.                     StringLength := ORD(ThisStr[0]) + 1;
  1106.                     IF DstDataOffset + StringLength > DstDataSize THEN
  1107.                         NewDataSize := DstDataSize + GrowIncrement;
  1108.                         SetHandleSize(DstData.dataHandle, NewDataSize);
  1109.                         IF Err <> noErr THEN
  1110.                             EXIT
  1111.                         END (*IF*);
  1112.                         DstDataSize := NewDataSize
  1113.                     END (*IF*);
  1114.                     INC(NrStrings);
  1115.                     BlockMoveData
  1116.                       (
  1117.                         (*sourcePtr :=*) ADR(ThisStr),
  1118.                         (*destPtr :=*) DstData.dataHandle^ + DstDataOffset,
  1119.                         (*byteCount :=*) StringLength
  1120.                       );
  1121.                     DstDataOffset := DstDataOffset + StringLength;
  1122.                   (* all done *)
  1123.                     EXIT
  1124.                 END (*LOOP*);
  1125.                 IF Err <> noErr THEN
  1126.                     KeepGoing := FALSE
  1127.                 END (*IF*)
  1128.             END AnotherString;
  1129.  
  1130.         BEGIN (*ConvertToStringListBlob*)
  1131.             SAVEREGS;
  1132.             InitAEDesc(SrcData);
  1133.             InitAEDesc(DstData);
  1134.             LOOP (*once*)
  1135.                 GetDataArg
  1136.                   (
  1137.                     (*@TheAppleEvent :=*) TheAppleEvent,
  1138.                     (*ArgKeyword :=*) AppleEvents.keyDirectObject,
  1139.                     (*DesiredType :=*) AppleEvents.typeAEList,
  1140.                     (*@TheData :=*) SrcData,
  1141.                     (*@Err :=*) Err
  1142.                   );
  1143.                 IF Err <> noErr THEN
  1144.                     EXIT
  1145.                 END (*IF*);
  1146.                 DstDataSize := GrowIncrement;
  1147.                 DstData.dataHandle := NewHandle(DstDataSize);
  1148.                 Err := MemError();
  1149.                 IF Err <> noErr THEN
  1150.                     EXIT
  1151.                 END (*IF*);
  1152.                 DstDataOffset := SIZE(ShortCard);
  1153.                 NrStrings := 0;
  1154.                 TraverseAEList
  1155.                   (
  1156.                     (*@TheList :=*) SrcData,
  1157.                     (*Action :=*) CAST(AEListAction, ADR(AnotherString)),
  1158.                     (*ActionArg :=*) CurrentA6(),
  1159.                     (*@Err :=*) Err
  1160.                   );
  1161.                 IF Err <> noErr THEN
  1162.                     EXIT
  1163.                 END (*IF*);
  1164.                 SetWord(NrStrings, DstData.dataHandle^);
  1165.                 SetHandleSize(DstData.dataHandle, DstDataOffset);
  1166.                 DstData.descriptorType := TypeBlob;
  1167.                 Err := AEPutParamDesc
  1168.                   (
  1169.                     (*@theAppleEvent :=*) Reply,
  1170.                     (*theAEKeyword :=*) AppleEvents.keyDirectObject,
  1171.                     (*@theAEDesc :=*) DstData
  1172.                   );
  1173.                 IF Err <> noErr THEN
  1174.                     EXIT
  1175.                 END (*IF*);
  1176.               (* all done *)
  1177.                 EXIT
  1178.             END (*LOOP*);
  1179.             DisposeAEDesc(SrcData);
  1180.             DisposeAEDesc(DstData);
  1181.             RETURN
  1182.                 Err
  1183.         END ConvertToStringListBlob;
  1184.  
  1185.         PROCEDURE AccessVersionProperty
  1186.           (
  1187.             DesiredClass : DescType;
  1188.             VAR Container : AEDesc;
  1189.             ContainerClass : DescType;
  1190.             KeyForm : DescType;
  1191.             VAR KeyData : AEDesc;
  1192.             VAR TheToken : AEDesc;
  1193.             TheRefCon : RefConType
  1194.           ) : OSErr;
  1195.           (* returns a token for the application's version property (read-only). *)
  1196.  
  1197.             VAR
  1198.                 PreviousResFile : IORefNum;
  1199.                 VersionDesc : AEDesc;
  1200.                 VersionState : HandleState;
  1201.  
  1202.         BEGIN
  1203.             PreviousResFile := CurResFile();
  1204.             VersionDesc.dataHandle := NIL;
  1205.             LOOP (*once*)
  1206.                 UseResFile(AppResFile);
  1207.                 VersionDesc.dataHandle := Get1Resource(Useful.VersionResourceType, 1);
  1208.                 IF VersionDesc.dataHandle = NIL THEN
  1209.                     Err := AppleEvents.errAEEventNotHandled;
  1210.                     EXIT
  1211.                 END (*IF*);
  1212.                 NoPurgeHandle(VersionDesc.dataHandle, VersionState);
  1213.                 VersionDesc.descriptorType := AERegistry.typeVersion;
  1214.                 CreateAEToken
  1215.                   (
  1216.                     (*TheCleanup :=*) NoCleanupList,
  1217.                     (*@Result :=*) TheToken,
  1218.                     (*@Err :=*) Err
  1219.                   );
  1220.                 IF Err <> noErr THEN
  1221.                     EXIT
  1222.                 END (*IF*);
  1223.                 SetDataDescriptorField
  1224.                   (
  1225.                     (*@TheToken :=*) TheToken,
  1226.                     (*@TheData :=*) VersionDesc,
  1227.                     (*@Err :=*) Err
  1228.                   );
  1229.                 IF Err <> noErr THEN
  1230.                     EXIT
  1231.                 END (*IF*);
  1232.               (* all done *)
  1233.                 EXIT
  1234.             END (*LOOP*);
  1235.             IF VersionDesc.dataHandle <> NIL THEN
  1236.                 HSetState(VersionDesc.dataHandle, VersionState)
  1237.             END (*IF*);
  1238.             UseResFile(PreviousResFile);
  1239.             RETURN
  1240.                 Err
  1241.         END AccessVersionProperty;
  1242.  
  1243.         PROCEDURE AccessSeedProperty
  1244.           (
  1245.             DesiredClass : DescType;
  1246.             VAR Container : AEDesc;
  1247.             ContainerClass : DescType;
  1248.             KeyForm : DescType;
  1249.             VAR KeyData : AEDesc;
  1250.             VAR TheToken : AEDesc;
  1251.             TheRefCon : RefConType
  1252.           ) : OSErr;
  1253.           (* returns a token for the application's seed
  1254.             property (read-only). *)
  1255.  
  1256.             VAR
  1257.                 TheSeed : LONGCARD;
  1258.  
  1259.         BEGIN
  1260.             LOOP (*once*)
  1261.                 CreateAEToken
  1262.                   (
  1263.                     (*TheCleanup :=*) NoCleanupList,
  1264.                     (*@Result :=*) TheToken,
  1265.                     (*@Err :=*) Err
  1266.                   );
  1267.                 IF Err <> noErr THEN
  1268.                     EXIT
  1269.                 END (*IF*);
  1270.                 Err := ICGetSeed(InternetConfig, TheSeed);
  1271.                 IF Err <> noErr THEN
  1272.                     EXIT
  1273.                 END (*IF*);
  1274.                 SetDataField
  1275.                   (
  1276.                     (*@TheToken :=*) TheToken,
  1277.                     (*DataType :=*) AppleEvents.typeLongInteger,
  1278.                     (*@Src :=*) TheSeed,
  1279.                     (*@Err :=*) Err
  1280.                   );
  1281.                 IF Err <> noErr THEN
  1282.                     EXIT
  1283.                 END (*IF*);
  1284.               (* all done *)
  1285.                 EXIT
  1286.             END (*LOOP*);
  1287.             RETURN
  1288.                 Err
  1289.         END AccessSeedProperty;
  1290.  
  1291.         PROCEDURE AccessGlobalStateProperty
  1292.           (
  1293.             DesiredClass : DescType;
  1294.             VAR Container : AEDesc;
  1295.             ContainerClass : DescType;
  1296.             KeyForm : DescType;
  1297.             VAR KeyData : AEDesc;
  1298.             VAR TheToken : AEDesc;
  1299.             VAR TheGlobal : StateVariable
  1300.           ) : OSErr;
  1301.           (* returns a token for a global boolean property which is read-only. *)
  1302.  
  1303.             VAR
  1304.                 BooleanValue : BOOLEAN;
  1305.  
  1306.         BEGIN
  1307.             LOOP (*once*)
  1308.                 CreateAEToken
  1309.                   (
  1310.                     (*TheCleanup :=*) NoCleanupList,
  1311.                     (*@Result :=*) TheToken,
  1312.                     (*@Err :=*) Err
  1313.                   );
  1314.                 IF Err <> noErr THEN
  1315.                     EXIT
  1316.                 END (*IF*);
  1317.                 BooleanValue := GetStateVariableState(TheGlobal) <> 0;
  1318.                 SetDataField
  1319.                   (
  1320.                     (*@TheToken :=*) TheToken,
  1321.                     (*DataType :=*) AppleEvents.typeBoolean,
  1322.                     (*@Src :=*) BooleanValue,
  1323.                     (*@Err :=*) Err
  1324.                   );
  1325.                 IF Err <> noErr THEN
  1326.                     EXIT
  1327.                 END (*IF*);
  1328.               (* all done *)
  1329.                 EXIT
  1330.             END (*LOOP*);
  1331.             RETURN
  1332.                 Err
  1333.         END AccessGlobalStateProperty;
  1334.  
  1335.         PROCEDURE AccessConfigEntryName
  1336.           (
  1337.             DesiredClass : DescType;
  1338.             VAR Container : AEDesc;
  1339.             ContainerClass : DescType;
  1340.             KeyForm : DescType;
  1341.             VAR KeyData : AEDesc;
  1342.             VAR TheToken : AEDesc;
  1343.             TheRefCon : RefConType
  1344.           ) : OSErr;
  1345.           (* returns a token for the name property property of a configuration entry. *)
  1346.  
  1347.             VAR
  1348.                 EntryName : Str255;
  1349.  
  1350.         BEGIN
  1351.             InitAEDesc(TheToken);
  1352.             LOOP (*once*)
  1353.                 GetPrivateDataField
  1354.                   (
  1355.                     (*@TheToken :=*) Container,
  1356.                     (*FieldID :=*) EntryNameFieldID,
  1357.                     (*DesiredType :=*) TypeBlob,
  1358.                     (*@Dst :=*) EntryName,
  1359.                     (*@Err :=*) Err
  1360.                   );
  1361.                 IF Err <> noErr THEN
  1362.                     EXIT
  1363.                 END (*IF*);
  1364.                 CreateAEToken
  1365.                   (
  1366.                     (*TheCleanup :=*) NoCleanupList,
  1367.                     (*@Result :=*) TheToken,
  1368.                     (*@Err :=*) Err
  1369.                   );
  1370.                 IF Err <> noErr THEN
  1371.                     EXIT
  1372.                 END (*IF*);
  1373.                 SetDataBlockField
  1374.                   (
  1375.                     (*@TheToken :=*) TheToken,
  1376.                     (*DataType :=*) AppleEvents.typeChar,
  1377.                     (*Src :=*) ADR(EntryName[1]),
  1378.                     (*Length :=*) ORD(EntryName[0]),
  1379.                     (*@Err :=*) Err
  1380.                   );
  1381.                 IF Err <> noErr THEN
  1382.                     EXIT
  1383.                 END (*IF*);
  1384.                 AddCompareProc
  1385.                   (
  1386.                     (*@TheToken :=*) TheToken,
  1387.                     (*Operator :=*) AppleEvents.typeWildCard,
  1388.                     (*Compare :=*) AEObjectUseful.CompareStrings,
  1389.                     (*@Err :=*) Err
  1390.                   );
  1391.                 IF Err <> noErr THEN
  1392.                     EXIT
  1393.                 END (*IF*);
  1394.               (* all done *)
  1395.                 EXIT
  1396.             END (*LOOP*);
  1397.             RETURN
  1398.                 Err
  1399.         END AccessConfigEntryName;
  1400.  
  1401.         PROCEDURE GetConfigEntryValue
  1402.           (
  1403.             VAR TheToken : AEToken;
  1404.             Dest : ADDRESS;
  1405.             DestType : DescType;
  1406.             RefCon : RefConType
  1407.           ) : OSErr;
  1408.           (* get-data routine to return the current value of a
  1409.             configuration entry. *)
  1410.  
  1411.             VAR
  1412.                 EntryName : Str255;
  1413.                 EntrySize : Size;
  1414.                 EntryAttributes : ICAttr;
  1415.  
  1416.         BEGIN
  1417.             LOOP (*once*)
  1418.                 GetPrivateDataField
  1419.                   (
  1420.                     (*@TheToken :=*) TheToken,
  1421.                     (*FieldID :=*) EntryNameFieldID,
  1422.                     (*DesiredType :=*) TypeBlob,
  1423.                     (*@Dst :=*) EntryName,
  1424.                     (*@Err :=*) Err
  1425.                   );
  1426.                 IF Err <> noErr THEN
  1427.                     EXIT
  1428.                 END (*IF*);
  1429.                 GetPrivateDataField
  1430.                   (
  1431.                     (*@TheToken :=*) TheToken,
  1432.                     (*FieldID :=*) EntrySizeFieldID,
  1433.                     (*DesiredType :=*) AppleEvents.typeLongInteger,
  1434.                     (*@Dst :=*) EntrySize,
  1435.                     (*@Err :=*) Err
  1436.                   );
  1437.                 IF Err <> noErr THEN
  1438.                     EXIT
  1439.                 END (*IF*);
  1440.                 Err := ICBegin(InternetConfig, ICTypes.icReadOnlyPerm);
  1441.                 IF Err = noErr THEN
  1442.                     Err := ICGetPref
  1443.                       (
  1444.                         (*inst :=*) InternetConfig,
  1445.                         (*key :=*) ADR(EntryName),
  1446.                         (*@attr :=*) EntryAttributes,
  1447.                         (*buf :=*) Dest,
  1448.                         (*@size :=*) EntrySize
  1449.                       );
  1450.                     IgnoreComponentResult(ICEnd(InternetConfig))
  1451.                 END (*IF*);
  1452.                 IF Err <> noErr THEN
  1453.                     EXIT
  1454.                 END (*IF*);
  1455.               (* all done *)
  1456.                 EXIT
  1457.             END (*LOOP*);
  1458.             RETURN
  1459.                 Err
  1460.         END GetConfigEntryValue;
  1461.  
  1462.         PROCEDURE SetConfigEntryValue
  1463.           (
  1464.             VAR TheToken : AEToken;
  1465.             VAR Src : AEDesc;
  1466.             RefCon : RefConType
  1467.           ) : OSErr;
  1468.           (* set-data routine to set a new value for a configuration entry. *)
  1469.  
  1470.             VAR
  1471.                 EntryName : Str255;
  1472.                 EntryAttributes : ICAttr;
  1473.                 EntrySize : Size;
  1474.                 SrcPtr : ADDRESS;
  1475.  
  1476.         BEGIN
  1477.             LOOP (*once*)
  1478.                 GetPrivateDataField
  1479.                   (
  1480.                     (*@TheToken :=*) TheToken,
  1481.                     (*FieldID :=*) EntryNameFieldID,
  1482.                     (*DesiredType :=*) TypeBlob,
  1483.                     (*@Dst :=*) EntryName,
  1484.                     (*@Err :=*) Err
  1485.                   );
  1486.                 IF Err <> noErr THEN
  1487.                     EXIT
  1488.                 END (*IF*);
  1489.                 GetPrivateDataField
  1490.                   (
  1491.                     (*@TheToken :=*) TheToken,
  1492.                     (*FieldID :=*) EntryAttributesFieldID,
  1493.                     (*DesiredType :=*) TypeEntryAttributes,
  1494.                     (*@Dst :=*) EntryAttributes,
  1495.                     (*@Err :=*) Err
  1496.                   );
  1497.                 IF Err <> noErr THEN
  1498.                     EXIT
  1499.                 END (*IF*);
  1500.                 IF Src.dataHandle <> NIL THEN
  1501.                     EntrySize := GetHandleSize(Src.dataHandle);
  1502.                     HLock(Src.dataHandle);
  1503.                     SrcPtr := Src.dataHandle^
  1504.                 ELSE
  1505.                     EntrySize := 0;
  1506.                     SrcPtr := NIL
  1507.                 END (*IF*);
  1508.                 Err := ICBegin(InternetConfig, ICTypes.icReadWritePerm);
  1509.                 IF Err = noErr THEN
  1510.                     Err := ICSetPref
  1511.                       (
  1512.                         (*inst :=*) InternetConfig,
  1513.                         (*key :=*) ADR(EntryName),
  1514.                         (*@attr :=*) EntryAttributes,
  1515.                         (*buf :=*) SrcPtr,
  1516.                         (*size :=*) EntrySize
  1517.                       );
  1518.                     IgnoreComponentResult(ICEnd(InternetConfig))
  1519.                 END (*IF*);
  1520.                 IF Src.dataHandle <> NIL THEN
  1521.                     HUnlock(Src.dataHandle)
  1522.                 END (*IF*);
  1523.                 IF Err <> noErr THEN
  1524.                     EXIT
  1525.                 END (*IF*);
  1526.               (* all done *)
  1527.                 EXIT
  1528.             END (*LOOP*);
  1529.             RETURN
  1530.                 Err
  1531.         END SetConfigEntryValue;
  1532.  
  1533.         PROCEDURE AccessConfigEntryValue
  1534.           (
  1535.             DesiredClass : DescType;
  1536.             VAR Container : AEDesc;
  1537.             ContainerClass : DescType;
  1538.             KeyForm : DescType;
  1539.             VAR KeyData : AEDesc;
  1540.             VAR TheToken : AEDesc;
  1541.             TheRefCon : RefConType
  1542.           ) : OSErr;
  1543.           (* returns a token for the value property of a configuration entry. *)
  1544.  
  1545.             VAR
  1546.                 EntryName : Str255;
  1547.                 EntrySize : Size;
  1548.                 EntryAttributes : ICAttr;
  1549.  
  1550.         BEGIN
  1551.             LOOP (*once*)
  1552.                 GetPrivateDataField
  1553.                   (
  1554.                     (*@TheToken :=*) Container,
  1555.                     (*FieldID :=*) EntryNameFieldID,
  1556.                     (*DesiredType :=*) TypeBlob,
  1557.                     (*@Dst :=*) EntryName,
  1558.                     (*@Err :=*) Err
  1559.                   );
  1560.                 IF Err <> noErr THEN
  1561.                     EXIT
  1562.                 END (*IF*);
  1563.                 GetPrivateDataField
  1564.                   (
  1565.                     (*@TheToken :=*) Container,
  1566.                     (*FieldID :=*) EntrySizeFieldID,
  1567.                     (*DesiredType :=*) AppleEvents.typeLongInteger,
  1568.                     (*@Dst :=*) EntrySize,
  1569.                     (*@Err :=*) Err
  1570.                   );
  1571.                 IF Err <> noErr THEN
  1572.                     EXIT
  1573.                 END (*IF*);
  1574.                 GetPrivateDataField
  1575.                   (
  1576.                     (*@TheToken :=*) Container,
  1577.                     (*FieldID :=*) EntryAttributesFieldID,
  1578.                     (*DesiredType :=*) TypeEntryAttributes,
  1579.                     (*@Dst :=*) EntryAttributes,
  1580.                     (*@Err :=*) Err
  1581.                   );
  1582.                 IF Err <> noErr THEN
  1583.                     EXIT
  1584.                 END (*IF*);
  1585.                 CreateAEToken
  1586.                   (
  1587.                     (*TheCleanup :=*) NoCleanupList,
  1588.                     (*@Result :=*) TheToken,
  1589.                     (*@Err :=*) Err
  1590.                   );
  1591.                 IF Err <> noErr THEN
  1592.                     EXIT
  1593.                 END (*IF*);
  1594.                 SetPrivateDataField
  1595.                   (
  1596.                     (*@TheToken :=*) TheToken,
  1597.                     (*FieldID :=*) EntryNameFieldID,
  1598.                     (*DataType :=*) TypeBlob,
  1599.                     (*@Src :=*) EntryName,
  1600.                     (*@Err :=*) Err
  1601.                   );
  1602.                 IF Err <> noErr THEN
  1603.                     EXIT
  1604.                 END (*IF*);
  1605.                 SetPrivateDataField
  1606.                   (
  1607.                     (*@TheToken :=*) TheToken,
  1608.                     (*FieldID :=*) EntrySizeFieldID,
  1609.                     (*DataType :=*) AppleEvents.typeLongInteger,
  1610.                     (*@Src :=*) EntrySize,
  1611.                     (*@Err :=*) Err
  1612.                   );
  1613.                 IF Err <> noErr THEN
  1614.                     EXIT
  1615.                 END (*IF*);
  1616.                 SetPrivateDataField
  1617.                   (
  1618.                     (*@TheToken :=*) TheToken,
  1619.                     (*FieldID :=*) EntryAttributesFieldID,
  1620.                     (*DataType :=*) TypeEntryAttributes,
  1621.                     (*@Src :=*) EntryAttributes,
  1622.                     (*@Err :=*) Err
  1623.                   );
  1624.                 IF Err <> noErr THEN
  1625.                     EXIT
  1626.                 END (*IF*);
  1627.                 SetDataTypeField
  1628.                   (
  1629.                     (*@TheToken :=*) TheToken,
  1630.                     (*DataType :=*) TypeBlob,
  1631.                     (*@Err :=*) Err
  1632.                   );
  1633.                 IF Err <> noErr THEN
  1634.                     EXIT
  1635.                 END (*IF*);
  1636.                 SetDataSizeField
  1637.                   (
  1638.                     (*@TheToken :=*) TheToken,
  1639.                     (*DataSize :=*) EntrySize,
  1640.                     (*@Err :=*) Err
  1641.                   );
  1642.                 IF Err <> noErr THEN
  1643.                     EXIT
  1644.                 END (*IF*);
  1645.                 SetGetDataRoutineField
  1646.                   (
  1647.                     (*@TheToken :=*) TheToken,
  1648.                     (*GetData :=*) GetConfigEntryValue,
  1649.                     (*RefCon :=*) NIL,
  1650.                     (*@Err :=*) Err
  1651.                   );
  1652.                 IF Err <> noErr THEN
  1653.                     EXIT
  1654.                 END (*IF*);
  1655.                 IF GetStateVariableState(ChangesAllowed) <> 0 THEN
  1656.                     SetSetDataRoutineField
  1657.                       (
  1658.                         (*@TheToken :=*) TheToken,
  1659.                         (*SetData :=*) SetConfigEntryValue,
  1660.                         (*RefCon :=*) NIL,
  1661.                         (*@Err :=*) Err
  1662.                       );
  1663.                     IF Err <> noErr THEN
  1664.                         EXIT
  1665.                     END (*IF*)
  1666.                 END (*IF*);
  1667.               (* all done *)
  1668.                 EXIT
  1669.             END (*LOOP*);
  1670.             RETURN
  1671.                 Err
  1672.         END AccessConfigEntryValue;
  1673.  
  1674.         PROCEDURE AccessConfigEntryAttribute
  1675.           (
  1676.             DesiredClass : DescType;
  1677.             VAR Container : AEDesc;
  1678.             ContainerClass : DescType;
  1679.             KeyForm : DescType;
  1680.             VAR KeyData : AEDesc;
  1681.             VAR TheToken : AEDesc;
  1682.             BitNr : LONGCARD
  1683.           ) : OSErr;
  1684.           (* returns a token for an attribute property of a configuration entry. *)
  1685.  
  1686.             VAR
  1687.                 EntryAttributes : ICAttr;
  1688.                 BitIsSet : BOOLEAN;
  1689.  
  1690.         BEGIN
  1691.             InitAEDesc(TheToken);
  1692.             LOOP (*once*)
  1693.                 GetPrivateDataField
  1694.                   (
  1695.                     (*@TheToken :=*) Container,
  1696.                     (*FieldID :=*) EntryAttributesFieldID,
  1697.                     (*DesiredType :=*) TypeEntryAttributes,
  1698.                     (*@Dst :=*) EntryAttributes,
  1699.                     (*@Err :=*) Err
  1700.                   );
  1701.                 IF Err <> noErr THEN
  1702.                     EXIT
  1703.                 END (*IF*);
  1704.                 BitIsSet := VAL(CARDINAL, BitNr) IN EntryAttributes;
  1705.                 CreateAEToken
  1706.                   (
  1707.                     (*TheCleanup :=*) NoCleanupList,
  1708.                     (*@Result :=*) TheToken,
  1709.                     (*@Err :=*) Err
  1710.                   );
  1711.                 IF Err <> noErr THEN
  1712.                     EXIT
  1713.                 END (*IF*);
  1714.                 SetDataField
  1715.                   (
  1716.                     (*@TheToken :=*) TheToken,
  1717.                     (*DataType :=*) AppleEvents.typeBoolean,
  1718.                     (*@Src :=*) BitIsSet,
  1719.                     (*@Err :=*) Err
  1720.                   );
  1721.                 IF Err <> noErr THEN
  1722.                     EXIT
  1723.                 END (*IF*);
  1724.                 AddCompareProc
  1725.                   (
  1726.                     (*@TheToken :=*) TheToken,
  1727.                     (*Operator :=*) AppleEvents.typeWildCard,
  1728.                     (*Compare :=*) AEObjectUseful.CompareBinary,
  1729.                     (*@Err :=*) Err
  1730.                   );
  1731.                 IF Err <> noErr THEN
  1732.                     EXIT
  1733.                 END (*IF*);
  1734.               (* all done *)
  1735.                 EXIT
  1736.             END (*LOOP*);
  1737.             RETURN
  1738.                 Err;
  1739.         END AccessConfigEntryAttribute;
  1740.  
  1741.         PROCEDURE DeleteConfigEntry
  1742.           (
  1743.             VAR TheAppleEvent : AppleEvent;
  1744.             VAR Reply : AppleEvent;
  1745.             HandlerRefCon : RefConType
  1746.           ) : OSErr;
  1747.           (* deletes an entry from the configuration database. *)
  1748.  
  1749.             VAR
  1750.                 Victim : AEToken;
  1751.                 EntryName : Str255;
  1752.  
  1753.         BEGIN
  1754.             LOOP (*once*)
  1755.                 IF GetStateVariableState(ChangesAllowed) = 0 THEN
  1756.                     Err := Errors.afpAccessDenied;
  1757.                     EXIT
  1758.                 END (*IF*);
  1759.                 GetCurrentToken(Victim);
  1760.                 GetPrivateDataField
  1761.                   (
  1762.                     (*@TheToken :=*) Victim,
  1763.                     (*FieldID :=*) EntryNameFieldID,
  1764.                     (*DesiredType :=*) TypeBlob,
  1765.                     (*@Dst :=*) EntryName,
  1766.                     (*@Err :=*) Err
  1767.                   );
  1768.                 IF Err <> noErr THEN
  1769.                     EXIT
  1770.                 END (*IF*);
  1771.                 Err := ICBegin(InternetConfig, ICTypes.icReadWritePerm);
  1772.                 IF Err = noErr THEN
  1773.                     Err := ICDeletePref
  1774.                       (
  1775.                         (*inst :=*) InternetConfig,
  1776.                         (*key :=*) ADR(EntryName)
  1777.                       );
  1778.                     IgnoreComponentResult(ICEnd(InternetConfig))
  1779.                 END (*IF*);
  1780.                 IF Err <> noErr THEN
  1781.                     EXIT
  1782.                 END (*IF*);
  1783.               (* all done *)
  1784.                 EXIT
  1785.             END (*LOOP*);
  1786.             RETURN
  1787.                 Err
  1788.         END DeleteConfigEntry;
  1789.  
  1790.         PROCEDURE AccessConfigEntry
  1791.           (
  1792.             DesiredClass : DescType;
  1793.             VAR Container : AEDesc;
  1794.             ContainerClass : DescType;
  1795.             KeyForm : DescType;
  1796.             VAR KeyData : AEDesc;
  1797.             VAR TheToken : AEDesc;
  1798.             TheRefCon : RefConType
  1799.           ) : OSErr;
  1800.           (* returns a token for a configuration entry. *)
  1801.  
  1802.             VAR
  1803.                 MatchName : Str255;
  1804.                 MatchIndex : LONGINT;
  1805.                 EntryAttributes : ICAttr;
  1806.                 EntrySize : Size;
  1807.                 EntryObjectDescriptor : AEDesc;
  1808.  
  1809.         BEGIN
  1810.             InitAEDesc(EntryObjectDescriptor);
  1811.             InitAEDesc(TheToken);
  1812.             LOOP (*once*)
  1813.                 IF KeyForm = AEObjects.formName THEN
  1814.                     CoerceToString
  1815.                       (
  1816.                         (*@TheDesc :=*) KeyData,
  1817.                         (*@Result :=*) MatchName,
  1818.                         (*@Err :=*) Err
  1819.                       )
  1820.                 ELSIF KeyForm = AEObjects.formAbsolutePosition THEN
  1821.                     CoerceToBlock
  1822.                       (
  1823.                         (*@TheDesc :=*) KeyData,
  1824.                         (*ToType :=*) AppleEvents.typeLongInteger,
  1825.                         (*@ToData :=*) MatchIndex,
  1826.                         (*@Err :=*) Err
  1827.                       );
  1828.                     IF Err <> noErr THEN
  1829.                         EXIT
  1830.                     END (*IF*);
  1831.                     Err := ICBegin(InternetConfig, ICTypes.icReadOnlyPerm);
  1832.                     IF Err = noErr THEN
  1833.                         Err := ICGetIndPref
  1834.                           (
  1835.                             (*inst :=*) InternetConfig,
  1836.                             (*n :=*) MatchIndex,
  1837.                             (*@key :=*) MatchName
  1838.                           );
  1839.                         IgnoreComponentResult(ICEnd(InternetConfig))
  1840.                     END (*IF*)
  1841.                 ELSE
  1842.                     Err := AppleEvents.errAEEventNotHandled
  1843.                 END (*IF*);
  1844.                 IF Err <> noErr THEN
  1845.                     EXIT
  1846.                 END (*IF*);
  1847.                 EntrySize := 0;
  1848.                 Err := ICBegin(InternetConfig, ICTypes.icReadOnlyPerm);
  1849.                 IF Err = noErr THEN
  1850.                     Err := ICGetPref
  1851.                       (
  1852.                         (*inst :=*) InternetConfig,
  1853.                         (*key :=*) ADR(MatchName),
  1854.                         (*@attr :=*) EntryAttributes,
  1855.                         (*buf :=*) NIL,
  1856.                         (*@size :=*) EntrySize
  1857.                       );
  1858.                     IgnoreComponentResult(ICEnd(InternetConfig))
  1859.                 END (*IF*);
  1860.                 IF Err = ICTypes.icTruncatedErr THEN
  1861.                     Err := noErr
  1862.                 ELSIF Err = ICTypes.icPrefNotFoundErr THEN
  1863.                     Err := AEObjects.errAENoSuchObject
  1864.                 END (*IF*);
  1865.                 IF Err <> noErr THEN
  1866.                     EXIT
  1867.                 END (*IF*);
  1868.                 CreateAEToken
  1869.                   (
  1870.                     (*TheCleanup :=*) NoCleanupList,
  1871.                     (*@Result :=*) TheToken,
  1872.                     (*@Err :=*) Err
  1873.                   );
  1874.                 IF Err <> noErr THEN
  1875.                     EXIT
  1876.                 END (*IF*);
  1877.                 SetPrivateDataField
  1878.                   (
  1879.                     (*@TheToken :=*) TheToken,
  1880.                     (*FieldID :=*) EntryNameFieldID,
  1881.                     (*DataType :=*) TypeBlob,
  1882.                     (*@Src :=*) MatchName,
  1883.                     (*@Err :=*) Err
  1884.                   );
  1885.                 IF Err <> noErr THEN
  1886.                     EXIT
  1887.                 END (*IF*);
  1888.                 SetPrivateDataField
  1889.                   (
  1890.                     (*@TheToken :=*) TheToken,
  1891.                     (*FieldID :=*) EntrySizeFieldID,
  1892.                     (*DataType :=*) AppleEvents.typeLongInteger,
  1893.                     (*@Src :=*) EntrySize,
  1894.                     (*@Err :=*) Err
  1895.                   );
  1896.                 IF Err <> noErr THEN
  1897.                     EXIT
  1898.                 END (*IF*);
  1899.                 SetPrivateDataField
  1900.                   (
  1901.                     (*@TheToken :=*) TheToken,
  1902.                     (*FieldID :=*) EntryAttributesFieldID,
  1903.                     (*DataType :=*) TypeEntryAttributes,
  1904.                     (*@Src :=*) EntryAttributes,
  1905.                     (*@Err :=*) Err
  1906.                   );
  1907.                 IF Err <> noErr THEN
  1908.                     EXIT
  1909.                 END (*IF*);
  1910.                 AddPropertyAccessorProc
  1911.                   (
  1912.                     (*@TheToken :=*) TheToken,
  1913.                     (*PropertyID :=*) AERegistry.pName,
  1914.                     (*Access :=*) AccessConfigEntryName,
  1915.                     (*RefCon :=*) NIL,
  1916.                     (*@Err :=*) Err
  1917.                   );
  1918.                 AddPropertyAccessorProc
  1919.                   (
  1920.                     (*@TheToken :=*) TheToken,
  1921.                     (*PropertyID :=*) ValuePropertyID,
  1922.                     (*Access :=*) AccessConfigEntryValue,
  1923.                     (*RefCon :=*) NIL,
  1924.                     (*@Err :=*) Err
  1925.                   );
  1926.                 AddPropertyAccessorProc
  1927.                   (
  1928.                     (*@TheToken :=*) TheToken,
  1929.                     (*PropertyID :=*) LockedPropertyID,
  1930.                     (*Access :=*) CAST(AccessorProc, AccessConfigEntryAttribute),
  1931.                     (*RefCon :=*) ICTypes.ICattrLockedBit,
  1932.                     (*@Err :=*) Err
  1933.                   );
  1934.                 AddPropertyAccessorProc
  1935.                   (
  1936.                     (*@TheToken :=*) TheToken,
  1937.                     (*PropertyID :=*) VolatilePropertyID,
  1938.                     (*Access :=*) CAST(AccessorProc, AccessConfigEntryAttribute),
  1939.                     (*RefCon :=*) ICTypes.ICattrVolatileBit,
  1940.                     (*@Err :=*) Err
  1941.                   );
  1942.                 AddAEHandlerProc
  1943.                   (
  1944.                     (*@TheToken :=*) TheToken,
  1945.                     (*EventClass :=*) AERegistry.kAECoreSuite,
  1946.                     (*EventID :=*) AERegistry.kAEDelete,
  1947.                     (*Handler :=*) DeleteConfigEntry,
  1948.                     (*HandlerRefCon :=*) NIL,
  1949.                     (*@Err :=*) Err
  1950.                   );
  1951.                 CreateEntryDescriptor
  1952.                   (
  1953.                     (*@EntryName :=*) MatchName,
  1954.                     (*@ObjectDescriptor :=*) EntryObjectDescriptor
  1955.                   );
  1956.                 IF Err <> noErr THEN
  1957.                     EXIT
  1958.                 END (*IF*);
  1959.                 SetObjectDescriptor
  1960.                   (
  1961.                     (*@TheToken :=*) TheToken,
  1962.                     (*ObjectClass :=*) ClassConfigEntry,
  1963.                     (*@ObjectDescriptor :=*) EntryObjectDescriptor,
  1964.                     (*@Err :=*) Err
  1965.                   );
  1966.                 IF Err <> noErr THEN
  1967.                     EXIT
  1968.                 END (*IF*);
  1969.               (* all done *)
  1970.                 EXIT
  1971.             END (*LOOP*);
  1972.             IF Err <> noErr THEN
  1973.                 DisposeAEToken(TheToken)
  1974.             END (*IF*);
  1975.             DisposeAEDesc(EntryObjectDescriptor);
  1976.             RETURN
  1977.                 Err
  1978.         END AccessConfigEntry;
  1979.  
  1980.         PROCEDURE CreateConfigEntry
  1981.           (
  1982.             VAR Reference : AEToken;
  1983.             Position : DescType;
  1984.             ObjectClass : DescType;
  1985.             VAR InitialData : AEDesc;
  1986.             VAR InitialProperties : AERecord;
  1987.             VAR ResultObjectSpecifier : AEDesc;
  1988.             RefCon : RefConType
  1989.           ) : OSErr;
  1990.           (* adds a new entry to the configuration database. *)
  1991.  
  1992.             VAR
  1993.                 EntryName : Str255;
  1994.                 EntryAttributes : ICAttr;
  1995.                 EntryData : AEDesc;
  1996.                 SrcPtr : ADDRESS;
  1997.                 EntrySize : Size;
  1998.  
  1999.             PROCEDURE GetAttribute
  2000.               (
  2001.                 FieldID : AEKeyword;
  2002.                 BitNr : CARDINAL
  2003.               );
  2004.  
  2005.             BEGIN
  2006.                 IF
  2007.                     GetBoolArg
  2008.                       (
  2009.                         (*@TheAppleEvent :=*) InitialProperties,
  2010.                         (*ArgKeyword :=*) FieldID,
  2011.                         (*Default :=*) FALSE,
  2012.                         (*@Err :=*) Err
  2013.                       )
  2014.                 THEN
  2015.                     INCL(EntryAttributes, BitNr)
  2016.                 END (*IF*);
  2017.             END GetAttribute;
  2018.  
  2019.         BEGIN (*CreateConfigEntry*)
  2020.             InitAEDesc(EntryData);
  2021.             LOOP (*once*)
  2022.                 IF GetStateVariableState(ChangesAllowed) = 0 THEN
  2023.                     Err := Errors.afpAccessDenied;
  2024.                     EXIT
  2025.                 END (*IF*);
  2026.                 GetStringArg
  2027.                   (
  2028.                     (*@TheAppleEvent :=*) InitialProperties,
  2029.                     (*ArgKeyword :=*) AERegistry.pName,
  2030.                     (*@TheArg :=*) EntryName,
  2031.                     (*@Err :=*) Err
  2032.                   );
  2033.                 IF Err <> noErr THEN
  2034.                     EXIT
  2035.                 END (*IF*);
  2036.               (* check entry doesn't already exist *)
  2037.                 Err := ICBegin(InternetConfig, ICTypes.icReadOnlyPerm);
  2038.                 IF Err = noErr THEN
  2039.                     Err := ICGetPref
  2040.                       (
  2041.                         (*inst :=*) InternetConfig,
  2042.                         (*key :=*) ADR(EntryName),
  2043.                         (*@attr :=*) EntryAttributes,
  2044.                         (*buf :=*) NIL,
  2045.                         (*@size :=*) EntrySize
  2046.                       );
  2047.                     IgnoreComponentResult(ICEnd(InternetConfig))
  2048.                 END (*IF*);
  2049.                 IF Err = ICTypes.icPrefNotFoundErr THEN
  2050.                     Err := noErr
  2051.                 ELSIF Err = noErr THEN
  2052.                     Err := Errors.afpObjectExists
  2053.                 END (*IF*);
  2054.                 IF Err <> noErr THEN
  2055.                     EXIT
  2056.                 END (*IF*);
  2057.                 EntryAttributes := ICAttr{};
  2058.               (* Doesn't actually make sense to allow setting any attributes *)
  2059.               (* GetAttribute(LockedPropertyID, ICTypes.ICattrLockedBit); *)
  2060.               (* GetAttribute(VolatilePropertyID, ICTypes.ICattrVolatileBit); *)
  2061.                 Err := AEGetKeyDesc
  2062.                   (
  2063.                     (*@theAERecord :=*) InitialProperties,
  2064.                     (*theAEKeyword :=*) ValuePropertyID,
  2065.                     (*desiredType :=*) TypeBlob,
  2066.                     (*@result :=*) EntryData
  2067.                   );
  2068.                 IF Err <> noErr THEN
  2069.                     EXIT
  2070.                 END (*IF*);
  2071.                 IF EntryData.dataHandle <> NIL THEN
  2072.                     EntrySize := GetHandleSize(EntryData.dataHandle);
  2073.                     HLock(EntryData.dataHandle);
  2074.                     SrcPtr := EntryData.dataHandle^
  2075.                 ELSE
  2076.                     EntrySize := 0;
  2077.                     SrcPtr := NIL
  2078.                 END (*IF*);
  2079.                 Err := ICBegin(InternetConfig, ICTypes.icReadWritePerm);
  2080.                 IF Err = noErr THEN
  2081.                     Err := ICSetPref
  2082.                       (
  2083.                         (*inst :=*) InternetConfig,
  2084.                         (*key :=*) ADR(EntryName),
  2085.                         (*@attr :=*) EntryAttributes,
  2086.                         (*buf :=*) SrcPtr,
  2087.                         (*size :=*) EntrySize
  2088.                       );
  2089.                     IgnoreComponentResult(ICEnd(InternetConfig))
  2090.                 END (*IF*);
  2091.                 IF EntryData.dataHandle <> NIL THEN
  2092.                     HUnlock(EntryData.dataHandle)
  2093.                 END (*IF*);
  2094.                 IF Err <> noErr THEN
  2095.                     EXIT
  2096.                 END (*IF*);
  2097.                 CreateEntryDescriptor
  2098.                   (
  2099.                     (*@EntryName :=*) EntryName,
  2100.                     (*@ObjectDescriptor :=*) ResultObjectSpecifier
  2101.                   );
  2102.               (* all done *)
  2103.                 EXIT
  2104.             END (*LOOP*);
  2105.             DisposeAEDesc(EntryData);
  2106.             RETURN
  2107.                 Err
  2108.         END CreateConfigEntry;
  2109.  
  2110.         PROCEDURE CountConfigEntries
  2111.           (
  2112.             DesiredType : DescType;
  2113.             ContainerClass : DescType;
  2114.             VAR Container : AEDesc;
  2115.             VAR Result : LONGCARD
  2116.           ) : OSErr;
  2117.           (* returns the number of configuration entries. *)
  2118.  
  2119.         BEGIN
  2120.             Err := ICBegin(InternetConfig, ICTypes.icReadOnlyPerm);
  2121.             IF Err = noErr THEN
  2122.                 Err := ICCountPref(InternetConfig, Result);
  2123.                 IgnoreComponentResult(ICEnd(InternetConfig))
  2124.             END (*IF*);
  2125.             RETURN
  2126.                 Err
  2127.         END CountConfigEntries;
  2128.  
  2129.         PROCEDURE InitAEHandling;
  2130.           (* installs my AppleEvent-related handlers. *)
  2131.  
  2132.             VAR
  2133.                 NullDescriptor : AEDesc;
  2134.  
  2135.             PROCEDURE InstallAEHandler
  2136.               (
  2137.                 TheEventClass : AEEventClass;
  2138.                 TheEventID : AEEventID;
  2139.                 TheHandler : AEHandlerProc
  2140.               );
  2141.  
  2142.             BEGIN
  2143.                 Err := AEInstallEventHandler
  2144.                   (
  2145.                     (*theAEEventClass :=*) TheEventClass,
  2146.                     (*theAEEventID :=*) TheEventID,
  2147.                     (*handler :=*) TheHandler,
  2148.                     (*handlerRefcon :=*) NIL,
  2149.                     (*isSysHandler :=*) FALSE
  2150.                   )
  2151.             END InstallAEHandler;
  2152.  
  2153.             PROCEDURE InstallPtrCoercionHandler
  2154.               (
  2155.                 FromType, ToType : DescType;
  2156.                 TheHandler : PtrCoercionHandler
  2157.               );
  2158.  
  2159.             BEGIN
  2160.                 Err := AEInstallPtrCoercionHandler
  2161.                   (
  2162.                     (*fromType :=*) FromType,
  2163.                     (*toType :=*) ToType,
  2164.                     (*handler :=*) TheHandler,
  2165.                     (*handlerRefcon :=*) NIL,
  2166.                     (*fromTypeIsDesc :=*) FALSE,
  2167.                     (*isSysHandler :=*) FALSE
  2168.                   )
  2169.             END InstallPtrCoercionHandler;
  2170.  
  2171.             PROCEDURE InstallDescCoercionHandler
  2172.               (
  2173.                 FromType, ToType : DescType;
  2174.                 TheHandler : DescCoercionHandler
  2175.               );
  2176.  
  2177.             BEGIN
  2178.                 Err := AEInstallDescCoercionHandler
  2179.                   (
  2180.                     (*fromType :=*) FromType,
  2181.                     (*toType :=*) ToType,
  2182.                     (*handler :=*) TheHandler,
  2183.                     (*handlerRefcon :=*) NIL,
  2184.                     (*fromTypeIsDesc :=*) TRUE,
  2185.                     (*isSysHandler :=*) FALSE
  2186.                   )
  2187.             END InstallDescCoercionHandler;
  2188.  
  2189.         BEGIN (*InitAEHandling*)
  2190.             InitAEDesc(NullDescriptor);
  2191.             Err := AEObjectInit();
  2192.             InstallAEHandler
  2193.               (
  2194.                 (*TheEventClass :=*) AppleEvents.kCoreEventClass,
  2195.                 (*TheEventID :=*) AppleEvents.kAEOpenApplication,
  2196.                 (*TheHandler :=*) HandleOpenApplicationEvent
  2197.               );
  2198.             InstallAEHandler
  2199.               (
  2200.                 (*TheEventClass :=*) AppleEvents.kCoreEventClass,
  2201.                 (*TheEventID :=*) AppleEvents.kAEQuitApplication,
  2202.                 (*TheHandler :=*) HandleQuitEvent
  2203.               );
  2204.             InstallAEHandler
  2205.               (
  2206.                 (*TheEventClass :=*) AERegistry.kAECoreSuite,
  2207.                 (*TheEventID :=*) AERegistry.kAEGetData,
  2208.                 (*TheHandler :=*) AEObjectUseful.HandleGetDataEvent
  2209.               );
  2210.             InstallAEHandler
  2211.               (
  2212.                 (*TheEventClass :=*) AERegistry.kAECoreSuite,
  2213.                 (*TheEventID :=*) AERegistry.kAEGetDataSize,
  2214.                 (*TheHandler :=*) AEObjectUseful.HandleGetDataSizeEvent
  2215.               );
  2216.             InstallAEHandler
  2217.               (
  2218.                 (*TheEventClass :=*) AERegistry.kAECoreSuite,
  2219.                 (*TheEventID :=*) AERegistry.kAECountElements,
  2220.                 (*TheHandler :=*) AEObjectUseful.HandleCountElementsEvent
  2221.               );
  2222.             InstallAEHandler
  2223.               (
  2224.                 (*TheEventClass :=*) AERegistry.kAECoreSuite,
  2225.                 (*TheEventID :=*) AERegistry.kAESetData,
  2226.                 (*TheHandler :=*) AEObjectUseful.HandleSetDataEvent
  2227.               );
  2228.             InstallAEHandler
  2229.               (
  2230.                 (*TheEventClass :=*) AERegistry.kAECoreSuite,
  2231.                 (*TheEventID :=*) AERegistry.kAEDoObjectsExist,
  2232.                 (*TheHandler :=*) AEObjectUseful.HandleExistsEvent
  2233.               );
  2234.             InstallAEHandler
  2235.               (
  2236.                 (*TheEventClass :=*) AERegistry.kAECoreSuite,
  2237.                 (*TheEventID :=*) AERegistry.kAEDelete,
  2238.                 (*TheHandler :=*) AEObjectUseful.DispatchEvent
  2239.               );
  2240.             InstallAEHandler
  2241.               (
  2242.                 (*TheEventClass :=*) AERegistry.kAECoreSuite,
  2243.                 (*TheEventID :=*) AERegistry.kAECreateElement,
  2244.                 (*TheHandler :=*) AEObjectUseful.HandleCreateElementEvent
  2245.               );
  2246.             InstallAEHandler
  2247.               (
  2248.                 (*TheEventClass :=*) MySignature,
  2249.                 (*TheEventID :=*) AERegistry.kAEAbout,
  2250.                 (*TheHandler :=*) HandleAboutEvent
  2251.               );
  2252.             InstallAEHandler
  2253.               (
  2254.                 (*TheEventClass :=*) MySignature,
  2255.                 (*TheEventID :=*) ScramblePasswordEventID,
  2256.                 (*TheHandler :=*) HandleScramblePassword
  2257.               );
  2258.             InstallAEHandler
  2259.               (
  2260.                 (*TheEventClass :=*) MySignature,
  2261.                 (*TheEventID :=*) UnscramblePasswordEventID,
  2262.                 (*TheHandler :=*) HandleScramblePassword
  2263.               );
  2264.             InstallAEHandler
  2265.               (
  2266.                 (*TheEventClass :=*) MySignature,
  2267.                 (*TheEventID :=*) ConvertFromPStringBlobID,
  2268.                 (*TheHandler :=*) ConvertFromPStringBlob
  2269.               );
  2270.             InstallAEHandler
  2271.               (
  2272.                 (*TheEventClass :=*) MySignature,
  2273.                 (*TheEventID :=*) ConvertToPStringBlobID,
  2274.                 (*TheHandler :=*) ConvertToPStringBlob
  2275.               );
  2276.             InstallAEHandler
  2277.               (
  2278.                 (*TheEventClass :=*) MySignature,
  2279.                 (*TheEventID :=*) ConvertFromTextBlobID,
  2280.                 (*TheHandler :=*) ConvertFromTextBlob
  2281.               );
  2282.             InstallAEHandler
  2283.               (
  2284.                 (*TheEventClass :=*) MySignature,
  2285.                 (*TheEventID :=*) ConvertToTextBlobID,
  2286.                 (*TheHandler :=*) ConvertToTextBlob
  2287.               );
  2288.             InstallAEHandler
  2289.               (
  2290.                 (*TheEventClass :=*) MySignature,
  2291.                 (*TheEventID :=*) ConvertFromStringListBlobID,
  2292.                 (*TheHandler :=*) ConvertFromStringListBlob
  2293.               );
  2294.             InstallAEHandler
  2295.               (
  2296.                 (*TheEventClass :=*) MySignature,
  2297.                 (*TheEventID :=*) ConvertToStringListBlobID,
  2298.                 (*TheHandler :=*) ConvertToStringListBlob
  2299.               );
  2300.             Err := AESetObjectCallbacks
  2301.               (
  2302.                 (*myCompareProc :=*) AEObjectUseful.CompareObjects,
  2303.                 (*myCountProc :=*) AEObjectUseful.CountElements,
  2304.                 (*myDisposeTokenProc :=*) AEObjectUseful.DisposeAEToken,
  2305.                 (*myGetMarkTokenProc :=*) AEObjects.noGetMarkTokenProc,
  2306.                 (*myMarkProc :=*) AEObjects.noMarkProc,
  2307.                 (*myAdjustMarksProc :=*) AEObjects.noAdjustMarksProc,
  2308.                 (*myGetErrDescProc :=*) AEObjects.noGetErrDescProc
  2309.               );
  2310.             Err := AEInstallObjectAccessor
  2311.               (
  2312.                 (*desiredClass :=*) AppleEvents.typeWildCard,
  2313.                 (*containerType :=*) AppleEvents.typeWildCard,
  2314.                 (*theAccessor :=*) AEObjectUseful.AccessObject,
  2315.                 (*accessorRefcon :=*) NIL,
  2316.                 (*isSysHandler :=*) FALSE
  2317.               );
  2318.             CreateAEToken
  2319.               (
  2320.                 (*TheCleanup :=*) NoCleanupList,
  2321.                 (*@Result :=*) AppToken,
  2322.                 (*@Err :=*) Err
  2323.               );
  2324.             SetObjectDescriptor
  2325.               (
  2326.                 (*@TheToken :=*) AppToken,
  2327.                 (*ObjectClass :=*) AERegistry.cApplication,
  2328.                 (*@ObjectDescriptor :=*) NullDescriptor,
  2329.                 (*@Err :=*) Err
  2330.               );
  2331.             AddCountProc
  2332.               (
  2333.                 (*@TheToken :=*) AppToken,
  2334.                 (*DesiredType :=*) ClassConfigEntry,
  2335.                 (*Count :=*) CAST(CountProc, CountConfigEntries),
  2336.                 (*@Err :=*) Err
  2337.               );
  2338.             AddPropertyAccessorProc
  2339.               (
  2340.                 (*@TheToken :=*) AppToken,
  2341.                 (*PropertyID :=*) AERegistry.pVersion,
  2342.                 (*Access :=*) AccessVersionProperty,
  2343.                 (*RefCon :=*) NIL,
  2344.                 (*@Err :=*) Err
  2345.               );
  2346.             AddPropertyAccessorProc
  2347.               (
  2348.                 (*@TheToken :=*) AppToken,
  2349.                 (*PropertyID :=*) SeedPropertyID,
  2350.                 (*Access :=*) AccessSeedProperty,
  2351.                 (*RefCon :=*) NIL,
  2352.                 (*@Err :=*) Err
  2353.               );
  2354.             AddPropertyAccessorProc
  2355.               (
  2356.                 (*@TheToken :=*) AppToken,
  2357.                 (*PropertyID :=*) ChangesAllowedPropertyID,
  2358.                 (*Access :=*) CAST(AccessorProc, AccessGlobalStateProperty),
  2359.                 (*RefCon :=*) ADR(ChangesAllowed),
  2360.                 (*@Err :=*) Err
  2361.               );
  2362.             AddPropertyAccessorProc
  2363.               (
  2364.                 (*@TheToken :=*) AppToken,
  2365.                 (*PropertyID :=*) ScramblingAllowedPropertyID,
  2366.                 (*Access :=*) CAST(AccessorProc, AccessGlobalStateProperty),
  2367.                 (*RefCon :=*) ADR(ScramblingAllowed),
  2368.                 (*@Err :=*) Err
  2369.               );
  2370.             AddAccessorProc
  2371.               (
  2372.                 (*@TheToken :=*) AppToken,
  2373.                 (*DesiredClass :=*) ClassConfigEntry,
  2374.                 (*Access :=*) AccessConfigEntry,
  2375.                 (*RefCon :=*) NIL,
  2376.                 (*@Err :=*) Err
  2377.               );
  2378.             AddElementCreatorRoutine
  2379.               (
  2380.                 (*@TheToken :=*) AppToken,
  2381.                 (*ObjectClass :=*) ClassConfigEntry,
  2382.                 (*CreateElement :=*) CreateConfigEntry,
  2383.                 (*RefCon :=*) NIL,
  2384.                 (*@Err :=*) Err
  2385.               );
  2386.         END InitAEHandling;
  2387.  
  2388.     END AEHandling;
  2389.  
  2390. (*
  2391.     Menu handling
  2392. *)
  2393.  
  2394.     MODULE MenuHandling;
  2395.  
  2396.         FROM SYSTEM IMPORT
  2397.             ADDRESS,
  2398.             CAST;
  2399.         FROM Types IMPORT
  2400.             ShortCard;
  2401.         FROM Menus IMPORT
  2402.             MenuHandle,
  2403.             CheckItem,
  2404.             GetMenu;
  2405.         IMPORT
  2406.             AppleEvents;
  2407.         IMPORT
  2408.             AERegistry;
  2409.         FROM CommandHandler IMPORT
  2410.             Command,
  2411.             CommandAction,
  2412.             StateHiliteAction,
  2413.             StateVariable,
  2414.             AddStateHiliteAction,
  2415.             DisposeCommand,
  2416.             GetStateVariableState,
  2417.             NewCommand,
  2418.             SetStateVariableState;
  2419.         FROM MenuHandler IMPORT
  2420.             Menu,
  2421.             DefaultMenuBar,
  2422.             AttachMenuToMenuBar,
  2423.             DisposeMenu,
  2424.             NewMenu,
  2425.             RefreshMenuBar,
  2426.             SetMenuCommand,
  2427.             SetupAppleMenu;
  2428.         IMPORT
  2429.             MySignature,
  2430.             ChangesAllowed,
  2431.             Err,
  2432.             QuitCommand,
  2433.             ScramblingAllowed,
  2434.             SendMyselfSimpleEvent;
  2435.  
  2436.         EXPORT
  2437.             SetupMenus;
  2438.  
  2439.         VAR
  2440.             OptionsMenu : MenuHandle;
  2441.         CONST
  2442.           (* IDs of items in Options menu *)
  2443.             ChangesAllowedItemID = 1;
  2444.             ScramblingAllowedItemID = 2;
  2445.  
  2446.         PROCEDURE HandleAboutCommand
  2447.           (
  2448.             Unused : ADDRESS
  2449.           );
  2450.           (* requests display of my about box. *)
  2451.  
  2452.         BEGIN
  2453.             SendMyselfSimpleEvent
  2454.               (
  2455.                 (*TheAEEventClass :=*) MySignature,
  2456.                 (*TheAEEventID :=*) AERegistry.kAEAbout
  2457.               )
  2458.         END HandleAboutCommand;
  2459.  
  2460.         PROCEDURE HandleQuitCommand
  2461.           (
  2462.             Unused : ADDRESS
  2463.           );
  2464.           (* requests the application to quit. *)
  2465.  
  2466.         BEGIN
  2467.             SendMyselfSimpleEvent
  2468.               (
  2469.                 (*TheAEEventClass :=*) AppleEvents.kCoreEventClass,
  2470.                 (*TheAEEventID :=*) AppleEvents.kAEQuitApplication
  2471.               )
  2472.         END HandleQuitCommand;
  2473.  
  2474.         PROCEDURE TrackState
  2475.           (
  2476.             HiliteIndex : ShortCard;
  2477.             Hilite : BOOLEAN;
  2478.             ItemIndex : LONGCARD
  2479.           );
  2480.           (* state variable state-change action which checks/unchecks
  2481.             corresponding menu item. *)
  2482.  
  2483.         BEGIN
  2484.             CheckItem(OptionsMenu, ItemIndex, Hilite)
  2485.         END TrackState;
  2486.  
  2487.         PROCEDURE ToggleState
  2488.           (
  2489.             TheState : StateVariable
  2490.           );
  2491.           (* command action which toggles the state of the specified
  2492.             state variable. *)
  2493.  
  2494.         BEGIN
  2495.             SetStateVariableState
  2496.               (
  2497.                 (*OfState :=*) TheState,
  2498.                 (*NewState :=*) 1 - GetStateVariableState(TheState)
  2499.               )
  2500.         END ToggleState;
  2501.  
  2502.         PROCEDURE SetupMenus;
  2503.           (* sets up my menus and associated handlers. *)
  2504.  
  2505.             VAR
  2506.                 ThisMenu : Menu;
  2507.                 ThisCommand : Command;
  2508.  
  2509.         BEGIN
  2510.           (* set up Apple menu *)
  2511.             NewMenu(GetMenu(128), ThisMenu, Err);
  2512.             SetupAppleMenu(ThisMenu, Err);
  2513.             NewCommand
  2514.               (
  2515.                 (*Action :=*) HandleAboutCommand,
  2516.                 (*ActionArg :=*) NIL,
  2517.                 (*Enabled :=*) TRUE,
  2518.                 (*@Result :=*) ThisCommand,
  2519.                 (*@Err :=*) Err
  2520.               );
  2521.             SetMenuCommand
  2522.               (
  2523.                 (*InMenu :=*) ThisMenu,
  2524.                 (*ItemID :=*) 1,
  2525.                 (*TheCommand :=*) ThisCommand,
  2526.                 (*@Err :=*) Err
  2527.               );
  2528.             DisposeCommand(ThisCommand);
  2529.             AttachMenuToMenuBar(ThisMenu, DefaultMenuBar, Err);
  2530.             DisposeMenu(ThisMenu);
  2531.           (* set up File menu *)
  2532.             NewMenu(GetMenu(129), ThisMenu, Err);
  2533.             NewCommand
  2534.               (
  2535.                 (*Action :=*) HandleQuitCommand,
  2536.                 (*ActionArg :=*) NIL,
  2537.                 (*Enabled :=*) TRUE,
  2538.                 (*@Result :=*) QuitCommand,
  2539.                 (*@Err :=*) Err
  2540.               );
  2541.             SetMenuCommand
  2542.               (
  2543.                 (*InMenu :=*) ThisMenu,
  2544.                 (*ItemID :=*) 1,
  2545.                 (*TheCommand :=*) QuitCommand,
  2546.                 (*@Err :=*) Err
  2547.               );
  2548.             AttachMenuToMenuBar(ThisMenu, DefaultMenuBar, Err);
  2549.             DisposeMenu(ThisMenu);
  2550.           (* set up Options menu *)
  2551.             OptionsMenu := GetMenu(130);
  2552.             NewMenu(OptionsMenu, ThisMenu, Err);
  2553.             NewCommand
  2554.               (
  2555.                 (*Action :=*) CAST(CommandAction, ToggleState),
  2556.                 (*ActionArg :=*) CAST(ADDRESS, ChangesAllowed),
  2557.                 (*Enabled :=*) TRUE,
  2558.                 (*@Result :=*) ThisCommand,
  2559.                 (*@Err :=*) Err
  2560.               );
  2561.             SetMenuCommand
  2562.               (
  2563.                 (*InMenu :=*) ThisMenu,
  2564.                 (*ItemID :=*) ChangesAllowedItemID,
  2565.                 (*TheCommand :=*) ThisCommand,
  2566.                 (*@Err :=*) Err
  2567.               );
  2568.             AddStateHiliteAction
  2569.               (
  2570.                 (*ToState :=*) ChangesAllowed,
  2571.                 (*Hilite :=*) CAST(StateHiliteAction, TrackState),
  2572.                 (*HiliteIndex :=*) 1,
  2573.                 (*HiliteArg :=*) ChangesAllowedItemID,
  2574.                 (*@Err :=*) Err
  2575.               );
  2576.             NewCommand
  2577.               (
  2578.                 (*Action :=*) CAST(CommandAction, ToggleState),
  2579.                 (*ActionArg :=*) CAST(ADDRESS, ScramblingAllowed),
  2580.                 (*Enabled :=*) TRUE,
  2581.                 (*@Result :=*) ThisCommand,
  2582.                 (*@Err :=*) Err
  2583.               );
  2584.             SetMenuCommand
  2585.               (
  2586.                 (*InMenu :=*) ThisMenu,
  2587.                 (*ItemID :=*) ScramblingAllowedItemID,
  2588.                 (*TheCommand :=*) ThisCommand,
  2589.                 (*@Err :=*) Err
  2590.               );
  2591.             AddStateHiliteAction
  2592.               (
  2593.                 (*ToState :=*) ScramblingAllowed,
  2594.                 (*Hilite :=*) CAST(StateHiliteAction, TrackState),
  2595.                 (*HiliteIndex :=*) 1,
  2596.                 (*HiliteArg :=*) ScramblingAllowedItemID,
  2597.                 (*@Err :=*) Err
  2598.               );
  2599.             AttachMenuToMenuBar(ThisMenu, DefaultMenuBar, Err);
  2600.             DisposeMenu(ThisMenu);
  2601.           (* done all menus *)
  2602.             RefreshMenuBar
  2603.         END SetupMenus;
  2604.  
  2605.     END MenuHandling;
  2606.  
  2607. (*
  2608.     Mainline
  2609. *)
  2610.  
  2611.     MODULE Mainline;
  2612.  
  2613.         FROM SYSTEM IMPORT
  2614.             ADDRESS;
  2615.         FROM Types IMPORT
  2616.             noErr;
  2617.         FROM Resources IMPORT
  2618.             CurResFile;
  2619.         FROM QuickDraw IMPORT
  2620.             OpenPortVar;
  2621.         IMPORT
  2622.             Components;
  2623.         FROM Useful IMPORT
  2624.             FinitToolbox,
  2625.             IgnoreComponentResult,
  2626.             InitToolbox;
  2627.         FROM Compatibility IMPORT
  2628.             AppleEventsPresent,
  2629.             GestaltSelectorPresent;
  2630.         FROM AEUseful IMPORT
  2631.             InitAEDesc;
  2632.         FROM CommandHandler IMPORT
  2633.             NewStateVariable;
  2634.         FROM EventHandler IMPORT
  2635.             EventLoop,
  2636.             FinitEventHandlers,
  2637.             InitEventHandlers,
  2638.             InstallQuitCheck;
  2639.         FROM MenuHandler IMPORT
  2640.             FinitMenuHandling,
  2641.             InitMenuHandling;
  2642.         FROM ICCAPI IMPORT
  2643.             ICFindConfigFile,
  2644.             ICStart,
  2645.             ICStop;
  2646.         IMPORT
  2647.             MySignature,
  2648.             NeedAppleScriptIndex,
  2649.             NeedInternetConfigIndex,
  2650.             AppResFile,
  2651.             ChangesAllowed,
  2652.             CurrentReply,
  2653.             DefaultPort,
  2654.             Err,
  2655.             InternetConfig,
  2656.             Quitting,
  2657.             ScramblingAllowed,
  2658.             DisplayErrorMessageIndex,
  2659.             InitAEHandling,
  2660.             SetupMenus;
  2661.  
  2662.         PROCEDURE CanRun() : BOOLEAN;
  2663.           (* is this system fit for me to run. *)
  2664.  
  2665.             VAR
  2666.                 ICan : BOOLEAN;
  2667.  
  2668.         BEGIN
  2669.             ICan := FALSE; (* initial assumption *)
  2670.             LOOP (*once*)
  2671.                 IF NOT AppleEventsPresent() THEN
  2672.                     DisplayErrorMessageIndex(NeedAppleScriptIndex);
  2673.                     EXIT
  2674.                 END (*IF*);
  2675.                 IF NOT GestaltSelectorPresent(Components.gestaltComponentMgr) THEN
  2676.                     DisplayErrorMessageIndex(NeedAppleScriptIndex);
  2677.                     EXIT
  2678.                 END (*IF*);
  2679.                 IF ICStart(InternetConfig, MySignature) <> noErr THEN
  2680.                     DisplayErrorMessageIndex(NeedInternetConfigIndex);
  2681.                     EXIT
  2682.                 END (*IF*);
  2683.               (* passed all checks: *)
  2684.                 ICan := TRUE;
  2685.                 EXIT
  2686.             END (*LOOP*);
  2687.             RETURN
  2688.                 ICan
  2689.         END CanRun;
  2690.  
  2691.         PROCEDURE CanQuit
  2692.           (
  2693.             Unused : ADDRESS
  2694.           ) : BOOLEAN;
  2695.           (* am I ready to quit. *)
  2696.  
  2697.         BEGIN
  2698.             RETURN
  2699.                 Quitting
  2700.         END CanQuit;
  2701.  
  2702.         PROCEDURE Initialize;
  2703.  
  2704.         BEGIN
  2705.             LOOP (*once*)
  2706.                 NewStateVariable
  2707.                   (
  2708.                     (*NrStates :=*) 1,
  2709.                     (*InitialState :=*) 0,
  2710.                     (*Enabled :=*) TRUE,
  2711.                     (*@Result :=*) ChangesAllowed,
  2712.                     (*@Err :=*) Err
  2713.                   );
  2714.                 NewStateVariable
  2715.                   (
  2716.                     (*NrStates :=*) 1,
  2717.                     (*InitialState :=*) 0,
  2718.                     (*Enabled :=*) TRUE,
  2719.                     (*@Result :=*) ScramblingAllowed,
  2720.                     (*@Err :=*) Err
  2721.                   );
  2722.                 Err := ICFindConfigFile
  2723.                   (
  2724.                     (*inst :=*) InternetConfig,
  2725.                     (*count :=*) 0,
  2726.                     (*folders :=*) NIL
  2727.                   );
  2728.                 IF Err <> noErr THEN
  2729.                     EXIT
  2730.                 END (*IF*);
  2731.                 InitEventHandlers(TRUE, Err);
  2732.                 InitMenuHandling(TRUE, TRUE, Err);
  2733.                 InstallQuitCheck(CanQuit, NIL, Err);
  2734.                 SetupMenus;
  2735.                 IF Err <> noErr THEN
  2736.                     EXIT
  2737.                 END (*IF*);
  2738.                 InitAEHandling;
  2739.                 IF Err <> noErr THEN
  2740.                     EXIT
  2741.                 END (*IF*);
  2742.               (* all done *)
  2743.                 EXIT
  2744.             END (*LOOP*)
  2745.         END Initialize;
  2746.  
  2747.         PROCEDURE Finalize;
  2748.  
  2749.         BEGIN
  2750.             FinitMenuHandling;
  2751.             FinitEventHandlers
  2752.         END Finalize;
  2753.  
  2754.     BEGIN (*Mainline*)
  2755.         InitToolbox;
  2756.         AppResFile := CurResFile();
  2757.         OpenPortVar(DefaultPort);
  2758.         Quitting := FALSE;
  2759.         InitAEDesc(CurrentReply);
  2760.         InternetConfig := NIL;
  2761.         LOOP (*once*)
  2762.             IF NOT CanRun() THEN
  2763.                 EXIT
  2764.             END (*IF*);
  2765.             Initialize;
  2766.             IF Err <> noErr THEN
  2767.                 EXIT
  2768.             END (*IF*);
  2769.             EventLoop;
  2770.           (* all done *)
  2771.             EXIT
  2772.         END (*LOOP*);
  2773.         IF InternetConfig <> NIL THEN
  2774.             IgnoreComponentResult(ICStop(InternetConfig))
  2775.         END (*IF*);
  2776.         Finalize;
  2777.         FinitToolbox
  2778.     END Mainline;
  2779.  
  2780. END InternetConfigAccess.
  2781.